2009-03-11 6 views
1

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.

Antwort

5

Ja, der Rückruf wird garantiert angerufen. Der Callback ermöglicht es, dass asynchroner Code, der das -Muster verwendet, in einem Fortsetzungsmodus geschrieben wird.

Sie müssen die entsprechende End* Methode in Ihrem Callback (normalerweise die erste Sache im Callback) jedoch aufrufen. So signalisiert die asynchrone Methode einerseits eine Ausnahme, die während des Aufrufs aufgetreten sein könnte, und andererseits, wie ein Ergebnis erzielt werden kann (falls vorhanden). Das Codieren des asynchronen Musters unter Verwendung von anonymen Delegaten bei Verwendung von C# 2.0 ist manchmal eleganter und erlaubt das Schreiben der Post-Call-Fortsetzung in der Nähe der Initiierung des Aufrufs und ermöglicht eine viel einfachere gemeinsame Nutzung von Daten durch erfasste Variablen dass geeignete Synchronisationsmaßnahmen verwendet werden.

Ref: http://msdn.microsoft.com/en-us/library/ms228972.aspx:

Anwendungen, die andere Arbeit tun können, während die Ergebnisse einer asynchronen Operation warten sollte nicht warten blockieren, bis der Vorgang abgeschlossen ist. Verwenden Sie eine der folgenden Optionen Ausführung von Befehlen fortzusetzen, während für einen asynchronen Betriebswarte abzuschließen:

  • einen AsyncCallback delegieren die Ergebnisse des asynchronen Betrieb in einem separaten Thread zu verarbeiten. Dieser Ansatz wird in diesem Thema demonstriert.

[...]

+0

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

+0

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. –

0

Ich glaube, der Rückruf wird nicht garantiert, wenn die CompletedSynchronously-Eigenschaft wahr ist.

1

Die AsyncCallback unabhängig davon aufgerufen werden, ob die Operation synchron oder asynchron durchgeführt wurde.

Verwandte Themen