C# Concurrency Teil 7: Die Task-Klasse
Die Task-Klasse repräsentiert eine CPU-bound oder eine IO-bound Aufgabe. Dieser Blog erklärt die wichtigsten Aspekten der Task-Klasse.
Zwei Task Typen
Zusammen mit TPL (Task Parallel Library) wurde mit .NET Framework 4.0 die Task-Klasse eingeführt. Im Kontext von TPL ist ein Task eine Abstraktion einer CPU-bound Aufgabe die durch den Thread Scheduler an einen Thread zugewiesen wird. Das kann ein Thread aus dem Threadpool sein oder ein eigener Thread (TaskCreationOptions.LongRunning).
In .NET Framework 4.5 wurde das async\await-Model für IO-bound Aufgaben eingeführt. Weil die Task-Klasse schon viele Eigenschaften hatte die es für async\await ebenfalls brauchte, hat Microsoft entschieden die Klasse zu erweitern und für async\await einzusetzen. Im Kontext von async\await wird ein Task nicht einem Thread zugewiesen. Es wird höchstens der Code nach dem await auf einem Threadpool Thread ausgeführt wenn ConfigureAwait(false) spezifiziert wurde. Doch dazu mehr in einem späteren Blog.
Es gibt also zwei Typen von Tasks die beide mit dem gleichen Konstrukt abgedeckt werden:
- Delegate Tasks (code-based tasks): für parallele CPU-bound Aufgaben. Dieser Task-Typ repräsentiert Code der parallel ausgeführt werden soll. Das passiert immer auf einem eigenen Thread.
- Promise Tasks (event-based tasks): für asynchrone IO-bound Aufgaben. Dieser Task-Typ repräsentiert ein Event oder Signal worauf gewartet werden muss. Der Code vor dem await wird auf dem aufrufenden Thread ausgeführt. Während des Wartens ist kein Thread aktiv und der Code nach dem await wird entweder auf dem aufrufenden Thread oder einen Threadpool Thread ausgeführt.