Maison > développement back-end > C++ > Comment Reflection peut-il simplifier la création de tâches asynchrones/en attente à partir d'événements ?

Comment Reflection peut-il simplifier la création de tâches asynchrones/en attente à partir d'événements ?

Barbara Streisand
Libérer: 2025-01-05 08:30:09
original
300 Les gens l'ont consulté

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

Achèvement de tâches à partir d'événements à l'aide de Reflection

Le modèle asynchrone/attente permet de créer facilement des tâches lors du déclenchement d'un événement. Toutefois, ce modèle nécessite une méthode FromEvent spécifique pour chaque événement. Pour simplifier cela, une solution plus généralisée était souhaitée, dans laquelle une méthode FromEvent pourrait gérer n'importe quel événement sur n'importe quelle instance.

En transmettant l'événement directement ou sous forme de chaîne, la réflexion offrait un chemin potentiel. Cependant, la création dynamique d'un gestionnaire pour accéder à TaskCompletionSource en réflexion posait des défis.

Invocation DynamicMethod personnalisée

La solution clé impliquait la création d'une méthode dynamique contenant la logique souhaitée. Le premier paramètre de cette méthode serait une instance de TaskCompletionSourceHolder. Cela permettait d'accéder à TaskCompletionSource à partir de l'IL généré.

Classe d'assistance et méthode d'extension

Une classe d'assistance, TaskCompletionSourceHolder, encapsulait la TaskCompletionSource et fournissait une méthode pour définir son résultat. La méthode d'extension FromEvent prenait l'objet source et le nom de l'événement comme paramètres. Il :

  • Créé une nouvelle instance TaskCompletionSource et TaskCompletionSourceHolder.
  • Récupéré les informations sur l'événement à l'aide de la réflexion.
  • Créé un type de délégué pour l'événement à l'aide de la réflexion.
  • Vérification que le type de délégué renvoie void.
  • Génération d'une dynamique méthode qui stockait les arguments transmis au gestionnaire d'événements dans un tableau.
  • A invoqué la méthode TaskCompletionSourceHolder.SetResult pour définir le résultat de la tâche.
  • Créé un délégué à partir de la méthode dynamique et l'a ajouté en tant que gestionnaire d'événements.

Événement pris en charge Types

Cette solution prend en charge tout événement renvoyant un vide, quelle que soit la liste de paramètres. Des améliorations supplémentaires peuvent être apportées pour prendre en charge n'importe quel type de valeur de retour si nécessaire.

Exemple d'utilisation

Vous trouverez ci-dessous un exemple d'utilisation de la méthode FromEvent personnalisée :

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;
}
Copier après la connexion

En utilisant notre méthode FromEvent généralisée, nous pouvons spécifier n'importe quel type d'événement sans avoir besoin d'un type de tâche explicite, simplifiant ainsi la gestion des événements dans Scénarios asynchrones/attente.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal