Aufrufen von einen EventHandler
Habe ich folgende Event-Handler:
private EventHandler<MyEventArgs> _myEventHandler;
public event EventHandler<MyEventArgs> MyEvent
{
add { _myEventHandler += value; }
remove { _myEventHandler -= value; }
}
Kann jemand erklären den Unterschied zwischen den folgenden snippets?
Snippet-Event-Handler (A):
//Snippet A:
if (_myEventHandler != null)
{
_myEventHandler(new MyEventArgs());
}
Snippet BeginInvoke (B):
//Snippet B:
if (_myEventHandler != null)
{
_myEventHandler.BeginInvoke(new MyEventArgs(), ar =>
{
var del = (EventHandler<MyEventArgs>)ar.AsyncState;
del.EndInvoke(ar);
}, _myEventHandler);
}
Zur Klärung: Was ist der Unterschied zwischen Berufung auf einen EventHandler "genau so ist es" und mit BeginInvoke
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
BeginInvoke
Ansatz ist asynchron, was bedeutet, dass es ausgelöst wird in einem anderen thread. Dies kann gefährlich sein, wenn die Menschen es nicht erwarten, und ist ziemlich selten für Veranstaltungen - aber es kann nützlich sein.Beachten Sie auch, dass streng genommen sollten Sie die snapshot-event-handler-Wert - das ist besonders wahr, wenn (über
Begin*
) Sie sind im Umgang mit threads.Auch - beachten Sie, dass Ihre Veranstaltung Abonnement sich ist nicht thread-sicher; wieder, dies ist nur von Bedeutung, wenn Sie den Umgang mit multi-threading, aber das eingebaute Feld-wie event - ist thread-sicher:
Die Probleme vermieden sind hier:
BeginInvoke()
rufen daraufhin sofort wieder die Kontrolle an die aufrufende thread und ausführen einer Stellvertretung in einem separaten thread aus derThreadPool
, so wird dies eine Art der asynchronen Ausführung.