2011-01-07 12 views
0

Ich arbeite an einer C# -Anwendung, in der ich einige asynchrone Funktionsaufrufe mit Delegaten eingerichtet habe. Diese Aufrufe unterliegen mehreren Aufrufen, so dass ich die Überladung der Methode BeginInvoke des Delegierten verwenden muss, die ein userState Argument nimmt; z.B .:Erfordern mehrere Asyncronous Invocations einzigartige Benutzerstatus?

callerDelegate.BeginInvoke([fn_args...], callback, userState) 

Auf der Event-based Asynchronous Pattern Overview page on MSDN, sagt er über userstate:

Es gibt möglicherweise zwei Überlastungen für die asynchronen Operationen: Single-Aufruf und Multiple-Aufruf. Sie können zwischen diesen beiden Formularen durch ihre Methodensignaturen unterscheiden: Das Mehrfachaufrufformular hat einen zusätzlichen Parameter namens userState. Dieses Formular macht es möglich, für Ihren Code Method1Async (Zeichenfolge param, Objekt userState) mehrere Male ohne Aufruf für alle ausstehenden asynchronen Operationen zu beenden. Wenn Sie auf der anderen Seite versuchen, Method1Async (Zeichenfolge param) aufzurufen, bevor ein vorheriger Aufruf abgeschlossen wurde, löst die Methode eine InvalidOperationException.

Der Parameter userState für die Mehrfachaufrufe ermöglicht Sie zwischen asynchronen Operationen zu unterscheiden. Sie bieten einen einzigartigen Wert (zum Beispiel eine GUID oder Hash-Code) für jeder Aufruf Method1Async (string param, Objekt userstate), und wenn jeder Vorgang abgeschlossen ist, wird Ihre Event-Handler die Instanz der bestimmen kann, Operation ausgelöst das Abschluss-Ereignis.

Meine Frage ist: hat die userStatehaben einzigartig zu sein? Der Wortlaut kann so ausgelegt werden, dass er nur eine Empfehlung oder nur für sein Beispiel relevant ist. Ich muss dem Callback den Status übergeben, ich brauche es nicht, um einzigartig zu sein. (Meine Anwendung muss nicht jede einzelne Instanz des Anrufs verfolgen.) Ist also Eindeutigkeit eine Voraussetzung? (Vielleicht ist der asynchrone Rahmen von .NET benötigt es?)

Auch die zitierte Seite ist für ereignisbasierte asynchrone Operationen; Gilt das auch für meinen Fall (asynchrone Aufrufe mit Delegaten)?

Ich habe google und SO für ein paar Tage gesucht und muss noch eine Antwort finden.

Vielen Dank im Voraus

Antwort

3

Es trifft nicht auf Ihren Fall zu. Begin/End sind das asynchrone Muster IAsyncResult, nicht das Event-Based Asynchronous Pattern (EAP).

Es wirkt sich auf EAP aus, da normalerweise die Implementierung AsyncOperationManager.CreateOperation verwendet, die einen eindeutigen Benutzerstatus erfordert.Selbst in diesem Fall ist es für den Endbenutzercode (normalerweise) gültig, einen null Benutzerstatus zu übergeben; Die EAP-Komponente würde diese durch eine new object ersetzen, wenn sie CreateOperation aufruft.

+0

Vielen Dank! (So ​​eine knappe Antwort auf eine solche ausführliche Frage!) – paul