Heim >Backend-Entwicklung >C++ >Wie kann Reflection die Erstellung asynchroner/wartender Aufgaben aus Ereignissen vereinfachen?

Wie kann Reflection die Erstellung asynchroner/wartender Aufgaben aus Ereignissen vereinfachen?

Barbara Streisand
Barbara StreisandOriginal
2025-01-05 08:30:09285Durchsuche

How Can Reflection Simplify Async/Await Task Creation from Events?

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:

  • Eine neue TaskCompletionSource- und TaskCompletionSourceHolder-Instanz erstellt.
  • Die Ereignisinformationen mithilfe von Reflektion abgerufen.
  • Einen Delegatentyp für das Ereignis mithilfe von Reflektion erstellt.
  • Überprüft, dass der Delegattyp „void“ zurückgegeben hat.
  • Generiert eine dynamische Methode, die die an den Ereignishandler übergebenen Argumente in einem Array speichert.
  • Die TaskCompletionSourceHolder.SetResult-Methode aufgerufen, um das Ergebnis der Aufgabe festzulegen.
  • Einen Delegaten aus der dynamischen Methode erstellt und hinzugefügt als Event-Handler.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn