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 :
É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; }
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!