ホームページ >バックエンド開発 >C++ >リフレクションによりイベントからの非同期/待機タスクの作成をどのように簡素化できるでしょうか?

リフレクションによりイベントからの非同期/待機タスクの作成をどのように簡素化できるでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-05 08:30:09345ブラウズ

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

リフレクションを使用したイベントからのタスク完了

非同期/待機パターンを使用すると、イベントの起動時にタスクを簡単に作成できます。ただし、このパターンでは、イベントごとに特定の FromEvent メソッドが必要です。これを単純化するために、1 つの FromEvent メソッドで任意のインスタンスの任意のイベントを処理できる、より一般化されたソリューションが望まれていました。

イベントを直接または文字列として渡す一方で、リフレクションは潜在的なパスを提供しました。ただし、リフレクションで TaskCompletionSource にアクセスするハンドラーを動的に作成すると、課題が生じました。

カスタム DynamicMethod 呼び出し

重要な解決策には、必要なロジックを含む動的メソッドを作成することが含まれていました。このメソッドの最初のパラメータは、TaskCompletionSourceHolder インスタンスになります。これにより、生成された IL 内から TaskCompletionSource にアクセスできるようになりました。

ヘルパー クラスと拡張メソッド

ヘルパー クラス TaskCompletionSourceHolder は、TaskCompletionSource をカプセル化し、設定するメソッドを提供しました。その結果。拡張メソッド FromEvent は、ソース オブジェクトとイベント名をパラメータとして受け取りました。

  • 新しい TaskCompletionSource および TaskCompletionSourceHolder インスタンスを作成しました。
  • リフレクションを使用してイベント情報を取得しました。
  • リフレクションを使用してイベントのデリゲート タイプを作成しました。
  • デリゲート型が返されたことを確認しましたvoid.
  • イベント ハンドラーに渡される引数を配列に格納する動的メソッドを生成しました。
  • TaskCompletionSourceHolder.SetResult メソッドを呼び出して、タスクの結果を設定しました。
  • Created動的メソッドからのデリゲートをイベントとして追加しましたhandler.

サポートされるイベント タイプ

このソリューションは、パラメーター リストに関係なく、void を返すイベントをサポートします。必要に応じて、任意の戻り値の型をサポートするために追加の改善を行うことができます。

使用例

以下は、カスタム FromEvent メソッドの使用方法の例です。

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;
}

一般化された FromEvent メソッドを使用すると、明示的なタスク タイプを必要とせずに任意のイベント タイプを指定できます。非同期/待機シナリオでのイベント処理を簡素化します。

以上がリフレクションによりイベントからの非同期/待機タスクの作成をどのように簡素化できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。