capypad
0 Tage Serie
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
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.