Heim >Backend-Entwicklung >C++ >Wie kann Reflection die Erstellung asynchroner/wartender Aufgaben aus Ereignissen vereinfachen?
Aufgabenabschluss aus Ereignissen mithilfe von Reflection
Das Async/Warten-Muster ermöglicht eine einfache Aufgabenerstellung beim Auslösen von Ereignissen. Dieses Muster erfordert jedoch für jedes Ereignis eine bestimmte FromEvent-Methode. Um dies zu vereinfachen, wurde eine allgemeinere Lösung gewünscht, bei der eine FromEvent-Methode jedes Ereignis auf jeder Instanz verarbeiten kann.
Während die Übergabe des Ereignisses direkt oder als Zeichenfolge mit Einschränkungen verbunden war, bot die Reflexion einen möglichen Weg. Das dynamische Erstellen eines Handlers für den Zugriff auf die TaskCompletionSource in der Reflektion stellte jedoch eine Herausforderung dar.
Benutzerdefinierter DynamicMethod-Aufruf
Die Schlüssellösung bestand darin, eine dynamische Methode zu erstellen, die die gewünschte Logik enthielt. Der erste Parameter dieser Methode wäre eine TaskCompletionSourceHolder-Instanz. Dies ermöglichte den Zugriff auf die TaskCompletionSource innerhalb der generierten IL.
Hilfsklasse und Erweiterungsmethode
Eine Hilfsklasse, TaskCompletionSourceHolder, kapselte die TaskCompletionSource und stellte eine Methode zum Festlegen bereit sein Ergebnis. Die Erweiterungsmethode FromEvent übernahm das Quellobjekt und den Ereignisnamen als Parameter. Es:
Unterstütztes Event Typen
Diese Lösung unterstützt jedes Leerzeichen zurückgebende Ereignis, unabhängig von der Parameterliste. Bei Bedarf können zusätzliche Verbesserungen vorgenommen werden, um jeden Rückgabewerttyp zu unterstützen.
Beispielverwendung
Unten finden Sie ein Beispiel für die Verwendung der benutzerdefinierten FromEvent-Methode:
static async void Run() { object[] result = await new MyClass().FromEvent("Fired"); // Output: 123, abcd } public class MyClass { // Event delegate type with two parameters public delegate void TwoThings(int x, string y); // Constructor to trigger event after a delay public MyClass() { new Thread(() => { Thread.Sleep(1000); Fired(123, "abcd"); }).Start(); } // Event using the custom TwoThings delegate public event TwoThings Fired; }
Mit unserer verallgemeinerten FromEvent-Methode können wir jeden Ereignistyp angeben, ohne dass ein expliziter Aufgabentyp erforderlich ist, und so die Ereignisbehandlung vereinfachen asynchrone/wartende Szenarien.
Das obige ist der detaillierte Inhalt vonWie kann Reflection die Erstellung asynchroner/wartender Aufgaben aus Ereignissen vereinfachen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!