| 

.NET C# Java Javascript Exception

3
Hallo!
Kann mir jemand erklären, wann ich welche Methode in C# nutze, um Code asynchron auszuführen? Delegate.BeginInvoke, IAsyncResult, neuer Thread, ThreadPool, … wann nehme ich eigentlich was?
31.05.2011
Helge Ortwig 51 2
1 Antwort
6
Hallo,

die Aufzählung ist noch nicht vollständig ;-)
ab .net 4.0: es kommt Task hinzu
ab .net 5.0: es kommt async hinzu

Grunsätzlich sollte vermieden werden direkt einen Thread per new Thread zu erstellen, denn das ist eine sehr kostspielige Operation und bereits beim Programmstart werden Threads erzeugt und im ThreadPool vorgehalten. Somit sollte vorzugsweise auch mit Threads aus dem ThreadPool gearbeitet werden. Das geht mit ThreadPool.QueueUserworkitem.
Außer: es handelt sich um eine sehr lange Operation und der ThreadPool wird noch anderswertig benötigt dann soll ein Thread per new erstellt werden, damit der ThreadPool "reaktionsfreudig" bleibt.

Anstatt mit dem ThreadPool zu arbeiten empfiehlt sich ab .net 4.0 mit den Tasks* zu arbeiten. Diese stellen eien Abstraktion über den Threads dar und vordergründig sind die Aufgaben die zu erledigen sind -> Tasks eben ;-)

Nun gibt es auch noch 2 ThreadPools - einer für die Worker-Threads und einen für die IO-Abschlussthreads. Der erstere ist jener mit dem wie oben beschrieben gearbeitet wird. Der zweite wird nicht direkt verwendet sondern dient dazu dass das Ende einer asynchronen IO-Operation (zB das Lesen einer großen Datei) abgeschlossen werden kann -> daher auch der Name. Zum Arbeiten werden Threads aus diesem Pool durch die BeginXXX / EndXXX Methoden für IO-Aufgaben.

Delegate.BeginInvoke wird eigentlich kaum benötigt und ist eher noch als "Legacy-Gründen" mit dabei.

* Tasks können auch so konfiguriert werden dass sie als neuer Threads ausgeführt werden (LongRunning)


mfG Gü
31.05.2011
gfoidl 9,4k 3 5

Stelle deine Thread-Frage jetzt!