Nach meiner BeginInvoke()/EndInvoke() Frage gibt es große Unterschiede in der Leistung/sonst etwas zwischen Delegate. BeginInvoke() und QueueUserWorkItem() verwenden, um einen Delegaten asynchron aufzurufen?Was ist der Unterschied zwischen QueueUserWorkItem() und BeginInvoke() zum Ausführen einer asynchronen Aktivität ohne Rückgabetypen erforderlich?
Antwort
http://blogs.msdn.com/cbrumme/archive/2003/07/14/51495.aspx
sagt:
„Eine überraschende Tatsache ist, dass dies auch, warum Delegate.BeginInvoke/ EndInvoke sind so langsam im Vergleich zu äquivalenten Techniken wie ThreadPool.QueueUserWorkItem (oder UnsafeQueueUserWorkItem Wenn Sie verstehen die Auswirkungen auf die Sicherheit und wollen wirklich effizient sein.) Die codepath für BeginInv oke/EndInvoke wandelt sich schnell in die allgemeine Nachricht Verarbeitungscode des allgemeinen Remoting-Signalwegs um. "
Hmmm, danke, das ist interessant und sehr gruselig. Ich denke, ich werde einen BeginInvoke()/EndInvoke() Code zurücksetzen, der keine Rückgabewerte erfordert! – endian
Die Hauptsache ich mit QueueUserWorkItem
denken kann, ist, dass Sie die WaitCallback
Delegattyp verwenden, die sieht heikel, wenn Sie bereits eine SomeRandomDelegate
Instanz und einige args haben. Die gute Nachricht ist, dass Sie dies mit einem Verschluss beheben:
ThreadPool.QueueUserWorkItem(
delegate { someDelegate(arg1, arg2); }
);
Dieses Muster sichert Sie auch die richtige starke Typisierung bei der Kompilierung erhalten (im Gegensatz zu Übergabe eines object
Zustand arg zu QueueUserWorkItem
und es in der Zielmethode Gießen). Dieses Muster kann auch verwendet werden, wenn Methoden direkt aufrufen:
ThreadPool.QueueUserWorkItem(
delegate { SomeMethod(arg1, arg2); }
);
Offensichtlich ohne ein EndInvoke
Äquivalent, können Sie auch keinen Rückgabewert zurück, es sei denn Sie eine Methode aufrufen/raise ein Ereignis/etc am Ende von Ihrer Methode ... mit einer verwandten Anmerkung, müssen Sie mit exception handling vorsichtig sein.
Begegnung mit diesem genauen Szenario war das erste Mal dachte ich mir: "Wow, ich liebe Verschlüsse. " –
Wow, das ist ein super Tipp. Es fühlt sich an wie eine Boxing/Unboxing-Semantik, und ich kann mir vorstellen, dass es nicht teurer, in einem breiten Schema von Dingen ist. –
Hoppla, technisch sollte es "delegate (object o)" oder ähnlich sein, damit der Code kompiliert wird, da QueueUserWorkItem eine Delegatesignatur erwartet, die mit WaitCallback übereinstimmt, d. H. Eine, die einen einzelnen Parameter vom Typ object enthält. –
Es sollte keinen großen Unterschied geben, ich denke auch, dass die generierte BeginInvoke/EndInvoke für einen Delegaten den Thread-Pool ausführt.
Es sollte keinen Leistungsunterschied geben, da sowohl Delegate.BeginInvoke als auch ThreadPool.QueueUserWorkItem in einem Threadpool-Thread ausgeführt werden.
Der größte Unterschied ist, dass wenn Sie BeginInvoke aufrufen, Sie EndInvoke irgendwann aufrufen müssen. Im Gegensatz dazu ist ThreadPool.QueueUserWorkItem "Feuer und vergessen". Das hat Vor- und Nachteile. Der Vorteil ist, dass Sie es vergessen können. Der Nachteil ist, dass Sie keine Möglichkeit haben, dies zu wissen, es sei denn, Sie fügen Ihren eigenen Synchronisations-/Benachrichtigungsmechanismus hinzu, wenn die Aufgabe abgeschlossen ist.
Die EndInvoke() ein nützliches, aber selten Verhalten erwähnt - es rethrows alle unbehandelten Ausnahmen, dass die Delegierten im Rahmen des ursprünglichen Thread erzeugt, so dass Sie die Ausnahmeverarbeitungslogik in den Hauptcode bewegen können.
Wenn Ihr Delegat über out/ref-Parameter verfügt, werden diese der EndInvoke() -Signatur hinzugefügt, damit Sie sie abrufen können, wenn die Ausführung der Methode abgeschlossen ist.
vielen dank, das wusste ich nicht – endian
Wenn Sie ThreadPool aufrufen.QueueUserWorkItem, Ausnahmen, die im Arbeitselement ausgelöst werden, werden im Hintergrundthread nicht behandelt (es sei denn, Sie fangen sie explizit ab). In .Net 2 und höher wird Ihre AppDomain beendet.
Wenn Sie delegate.BeginInvoke() aufrufen, werden Ausnahmen in die Warteschlange gestellt, wenn EndInvoke() aufgerufen wird. Wenn Sie EndInvoke() nie aufrufen, sind die Ausnahmen im Wesentlichen Speicher "durchgesickert" (wie jeder andere Status, der von der asynchronen Operation nicht freigegeben wird).
- 1. Unterschied zwischen BeginInvoke und Thread.Start
- 2. Was ist der Unterschied zwischen synchronen Apis und asynchronen Apis?
- 3. Was ist der Unterschied zwischen asynchronen Calls und Callbacks
- 4. Was ist der Unterschied zwischen einem asynchronen Delegaten und einer asynchronen Methode?
- 5. Was ist der Unterschied zwischen Aktivität und Absicht in Android?
- 6. Was ist der Unterschied zwischen PHP erforderlich und enthalten?
- 7. Was ist der Unterschied zwischen der Verwendung von cfinvoke und createObject zum Ausführen einer Komponentenfunktion?
- 8. Was ist der Unterschied zwischen InvokeAsync und BeginInvoke für WPF Dispatcher
- 9. Java - Was ist der Unterschied zwischen Doppelklick und Ausführen von Terminal zum Öffnen einer .jar-Datei?
- 10. Was ist der Unterschied zwischen `==` und `ist`?
- 11. Was ist der Unterschied zwischen $ (...) und `...`
- 12. Was ist der Unterschied zwischen getResourceAsStream mit und ohne getClassLoader?
- 13. Was ist der Unterschied zwischen? und ? = Nil
- 14. Was ist der Unterschied zwischen einer Portnummer und einer Protokollnummer?
- 15. Was ist der Unterschied zwischen einer Subroutine und einer Funktion?
- 16. Was ist der Unterschied zwischen einer Eigenschaft und einer Instanzvariablen?
- 17. Was ist der Unterschied zwischen einer "nonce" und einer "GUID"?
- 18. Was ist der Unterschied zwischen einer HashMap und einer TreeMap?
- 19. Was ist der Unterschied zwischen einer Webreferenz und einer Servicereferenz?
- 20. Was ist der Unterschied zwischen:
- 21. Was ist der Unterschied zwischen [string()] und list() in erlang?
- 22. Was ist der Unterschied zwischen Verilog! und ~?
- 23. Was ist der Unterschied zwischen:.! und: r !?
- 24. Was ist der Unterschied zwischen Difftime und '-'?
- 25. Was ist der Unterschied zwischen $ und $$?
- 26. was ist der Unterschied zwischen [[], []] und [[]] * 2
- 27. Was ist der Unterschied zwischen/* ... */und/** ... */
- 28. Was ist der Unterschied zwischen `&` und `ref`?
- 29. Was ist der Unterschied zwischen .Equals und ==
- 30. Was ist der Unterschied zwischen "$^N" und "$ +"?
Sie können auch sehen: http://marcgravell.blogspot.com/2009/02/async-without-pain.html –