Ich mache asynchrone Web-Service-Anrufe von einem C# App:Rufen asynchrone Webdienstaufrufe immer den AsyncCallback auf?
{
//Put UI in 'loading' state
...
//Now call web service
webServiceProxy.BeginMyMethod(param, new AsyncCallback(MyCallback), null);
}
private void MyCallback(IAsyncResult res)
{
...
//process result
// Put UI back in normal state (yes I'm marshalling back to the UI thread)
}
Der Haupt-Thread der App in einem „Wartemodus“ versetzt, und dann wird das Ende der Callback-Funktion wieder aktiviert die Kontrollen. Ich sehe einen Fehler, der gelegentlich dazu führt, dass die Benutzeroberfläche im Lademodus für immer blockiert ist.
Jetzt kann es nur um einen Fehler in dem Callback-Code sein (es gibt ziemlich viel gibt), aber meine Frage an die Gemeinde hier ist diese:
Ist „MyCallback“ garantiert genannt werden? Angenommen, dass "BeginMyMethod" keine Ausnahme ausgelöst hat, kann ich sicher sein, dass MyCallback ausgeführt wird? Ich sehe ein "CompletedSynchronously" und "IsCompleted" auf dem von den BeginXXX-Funktionen zurückgegebenen IAsyncResult, aber ich bin mir nicht sicher, ob das wichtig ist oder nicht.
Ist Ihnen eine Referenz auf MSDN oder irgendetwas, das dies feststellt, bekannt? Ich hatte den Eindruck, dass es so funktioniert, aber ich habe nie eine Bestätigung gefunden, dass dies garantiert ist. Bei allen MSDN-Beispielen wird der primäre Thread sinnlos in einer while-Schleife rotiert, wobei die IsComplete überprüft wird. – Clyde
Ich habe meine Antwort mit einer Referenz aktualisiert, die auch ein Beispiel enthält, das explizit den AsyncCallback-Delegaten verwendet. Es ist jedoch im Stil von C# 1.0 geschrieben; idiomatisch wäre jetzt, einen anonymen Delegierten zu verwenden. –