2009-09-03 4 views
15

Ich habe folgendes Muster vor kurzem bemerkt, aber ich weiß nicht ganz die Nutzung der completedSynchronously Eigenschaft erfassen:AsyncCallback completedSynchronously

IAsyncResult channelOpenResult = channel.BeginOpen(new AsyncCallback(OnOpenCompleteChannel), channel); 
if (channelOpenResult.CompletedSynchronously) 
{ 
    CompleteOpenChannel(channelOpenResult); 
} 

Und dann wieder, in dem Rückruf:

void OnOpenCompleteChannel(IAsyncResult result) 
{ 
    if (result.CompletedSynchronously) 
     return; 
    else 
     CompleteOpenChannel(result); 
} 

Und irgendwo im Code steht natürlich eine Funktion:

void CompleteOpenChannel(IAsyncResult result) ... 

Ist das ein Weg zur handl e der asynchrone Aufruf unterschiedlich abhängig davon, ob er direkt abschließt oder nicht? Aber warum sollte es in diesem Fall verwendet werden, da der AsyncCallback immer aufgerufen wird (oder?)? Kann jemand ein Beispiel geben, wo der Anruf synchron erfolgt?

Antwort

8

Siehe this blog. Ein allgemeines Muster funktioniert async in einer Schleife und die Überprüfung von CompletedSynchronously hilft, den Fall zu vermeiden, in dem Sie "unglücklich" sind und eine Reihe von Async-Aufrufen passieren, um die Synchronisierung abzuschließen, und Sie riskieren StackOverflowException. (Wenn Sie z. B. Daten über das Netzwerk lesen und die Daten, die Sie lesen, bereits über die Leitung übertragen und gepuffert sind, kann Ihr asynchroner Anruf synchron abgeschlossen werden, was bedeutet, dass Ihr Rückruf auf demselben Thread (mit einem höheren Wert) aufgerufen wird stack), was bedeutet, dass Sie besser keinen weiteren asynchronen Anruf in einer Schleife planen.)

0

Gemäß dieser document können Sie den Aufruf mit einem synchronen und ASync-Rückruf liefern, und nur wenn der Aufruf nicht synchron behandelt wurde, ruft er die ASync-Methoden auf. Ich denke nicht, dass dies wirklich auf Silverlight anwendbar ist (weil alle Silverlight-Aufrufe zu einem gewissen Grad ASync sind), wird aber wahrscheinlich mehr für benutzerdefinierte Factories in anderen .NET-Anwendungen verwendet.

Hoffe, das hilft.

Verwandte Themen