Frage

Ich verwende ADO.NET Datendienste in einer Silverlight-Anwendung, und da die Silverlight-Bibliotheken unterstütze nicht den ToList () -Aufruf auf dem IQueryable Ich dachte, es möglich sein könnte, eine Erweiterungsmethode, um diesen genannt SilverlightToList () zu erstellen. Also in diesem Verfahren als ich rufe die BeginExecute Methode auf meinem Kontext unten dargestellt:

            var result = context.BeginExecute<T>(currentRequestUri,null,context);
            result.AsyncWaitHandle.WaitOne();
            return context.EndExecute<T>(result).ToList();

Das Problem ist, dass, wenn ich die WaitOne () -Methode aufrufen, diese in eine Sackgasse führt. Ist dies eine Einschränkung von ADO.NET Datendienste in Silverlight? Gibt es vielleicht eine Abhilfe für dieses?

War es hilfreich?

Lösung 2

Ich habe da gefunden diesen Beitrag auf dem MSDN Forum, das besagt, dass jede Managed-> UnManaged-> Managed Rangierung auf dem UI-Thread geschieht weshalb der WaitOne Methodenaufruf erklärt hängt ...

Andere Tipps

Ich habe Niederlage geschaffen (: P) die Asynchron-Monster in Silverlight etwa so:

var ctx = new ModelEntities(new Uri("http://localhost:2115/Data.svc"));

ManualResetEvent m1 = new ManualResetEvent(false);
ManualResetEvent m2 = new ManualResetEvent(false);

var q1 = (DataServiceQuery<Department>)(from e in ctx.Department select e);
var q2 = (DataServiceQuery<Person>)(from e in ctx.Person select e);

Department[] r1 = null;
Person[] r2 = null;

q1.BeginExecute(r =>
{
    try { r1 = q1.EndExecute(r).ToArray(); }
    finally { m1.Set(); }
}, null);
q2.BeginExecute(r =>
{
    try { r2 = q2.EndExecute(r).ToArray(); }
    finally { m2.Set(); }
}, null);

ThreadPool.QueueUserWorkItem((o) =>
{
    WaitHandle.WaitAll(new WaitHandle[] { m1, m2 });
    // do your thing..
});

Der Grund ideea ist ein Kellner Thread (der letzte Block), um zu laichen, die Verweise auf die Warten Objekte haben würde. setzen Sie Ihren WaitAll Anruf in dem Anrufer Methode / Thread nicht, weil dies zu einem Deadlock führen wie andere erwähnten früher auf dieser Website oder anderen Websites.

Der Deadlock tritt auf, weil die Fäden beginnen erst endet das Verfahren und das Verfahren endet nicht, weil die WaitAll Anruf wartet das Kind Threads zu beenden.

Nicht in meinem Fall oben jedoch, weil der WaitAll auf einem anderen Thread ist.

PS: Statt der // Ihre Sache Linie Platz Code tun, dass die R1 und R2 verwendet aufgenommenen Referenzen, die die Daten enthalten wird oder null, wenn das Ergebnis ausgefallen

.

Silverlight wahrscheinlich wird nicht synchron etwas mögen, weil es beabsichtigt ist im Browser ausgeführt werden, und es kann nur einen Thread hat, mit zu spielen - und es hat, dass zu teilen. Und der einzige Thread für den Host ist die vom Browser zur Verfügung gestellt.

Alle Service-Anrufe in Silverlight müssen asynchron sein. So haben Sie einen Rückruf definieren, um das Ergebnis zu erhalten - wie folgt aus:

context.BeginExecute<T>(currentRequestUri, resultCallback, context);

private void resultCallback(IAsyncResult asyncResult)
{
    DataServiceContext context = asyncResult.AsyncState as DataServiceContext;
    var result = context.EndExecute<T>(asyncResult);
    // Do whatever you need with the result here
}

Hier ist eine gute Referenz auf MSDN: http://msdn.microsoft.com/en- us / library / cc838191 (VS.95) aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top