C# - Asynchrone Aufruf ohne EndInvoke?
Nehmen Sie die folgenden Klassen als Beispiel.
public class A
{
//...
void Foo(S myStruct){...}
}
public class B
{
public A test;
//...
void Bar()
{
S myStruct = new S();
test.Foo(myStruct);
}
}
Nun möchte ich, dass die method-call test.Foo(myStruct) ein asynchroner Aufruf ("fire-and-forget'). Die bar-Methode muss so schnell wie möglich zurück. Dokumentation Delegierten, BeginInvoke, EndInvoke, die ThreadPool-etc. ist nicht zu helfen mir eine Lösung zu finden.
Ist dies eine gültige Lösung?
//Is using the `EndInvoke` method as the callback delegate valid?
foo.BeginInvoke(myStruct, foo.EndInvoke, null);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie nicht verpflichtet, call -
EndInvoke
; nicht aufrufen, es bedeutet lediglich:Es klingt wie Sie möchten "Feuer-und-vergessen', so ist der einfachste Weg, dies zu tun ist, um eine anonyme Delegaten, zum Beispiel:
Dies ist, was passiert, wenn Sie diesen code ausführen:
del
und die anonymen Delegaten (iar => ...
).del
.EndInvoke
ist aufgerufen, das Ergebnis der Methode ist entweder zurückgegeben, oder die Ausnahme geworfen wird (wenn eine vorliegt).Beachten Sie, dass das obige Beispiel ist sehr Verschieden von:
Edit: sollten Sie immer anrufen
End*
. Ich habe nie gefunden, ein Szenario, wo Sie nicht nennen es ein problem darstellt, aber das ist ein Implementierungsdetail und ist unter Berufung auf nicht dokumentierten Verhalten.Schließlich Ihre Lösung würde den Prozess zum Absturz, wenn eine Ausnahme geworfen wird,
, können Sie einfach übergeben Sie null als die delegieren, wenn Sie kümmern sich nicht um die Ausnahme (So als ein letztes Beispiel, was du suchst ist wohl:del.BeginInvoke(myStruct, null, null);
).EndInvoke
, aber wenn Sie nicht bekommen Sie memory leaks. stackoverflow.com/questions/1712741/...Begin/End-Invoke
Paaren - ein Beispiel ist: wenn Sie don ' T callEndInvoke
aufSocket
Operationen der Buchse Leistungsindikatoren gehen vollständig aus dem Gleichgewicht geraten (kein memory-leak, die Werte werden einfach völlig falsch).Ich würde sagen, dass Ihre beste option ist die Verwendung der
ThreadPool
:Diese Warteschlange wird der Ausschnitt für die Ausführung in einem separaten thread. Jetzt müssen Sie auch vorsichtig sein, über etwas anderes: wenn du mehrere threads greifen auf die gleiche Instanz von
A
und das Beispiel ändert eine variable, dann müssen Sie sicherstellen, dass Sie die richtige Synchronisierung der Variablen.Können Sie die Callback-Modell erklärt @ Was ist AsyncCallback?
Diese Weise Ihre EndInvoke werden nicht in bar(), aber in eine separate callback-Methode.
In dem Beispiel, das EndRead (entsprechend EndInvoke ist in der callback-Methode aufgerufen CompleteRead anstatt die aufrufende Methode TestCallbackAPM entsprechenden bar)
Dies ist eine option: