csharp / expert
Snippet
Implementierung eigener Awaiter
In C# kann jeder Typ 'erwartet' (awaited) werden, wenn er das 'GetAwaiter'-Muster implementiert. Diese Technik für Experten ermöglicht es, eigene asynchrone Primitive zu erstellen, ohne auf Task oder ValueTask angewiesen zu sein, was die Allokationskosten in spezialisierten Hochleistungsszenarien senkt.
snippet.csharp
1
2
3
4
5
6
7
8
9
public struct MyTaskAwaiter : INotifyCompletion {public bool IsCompleted => false;public void OnCompleted(Action continuation) => Task.Run(continuation);public void GetResult() { }}public struct MyCustomTask {public MyTaskAwaiter GetAwaiter() => new MyTaskAwaiter();}
Erklärung
1
public bool IsCompleted => false;
Bestimmt, ob die Operation bereits abgeschlossen ist; wenn falsch, gibt die Statemachine die Kontrolle ab.
2
public MyTaskAwaiter GetAwaiter()
Die Duck-Typing-Methode, nach der der Compiler sucht, um das 'await'-Schlüsselwort zu ermöglichen.