リフレクションを使用したイベントからのタスク完了
非同期/待機パターンを使用すると、イベントの起動時にタスクを簡単に作成できます。ただし、このパターンでは、イベントごとに特定の FromEvent メソッドが必要です。これを単純化するために、1 つの FromEvent メソッドで任意のインスタンスの任意のイベントを処理できる、より一般化されたソリューションが望まれていました。
イベントを直接または文字列として渡す一方で、リフレクションは潜在的なパスを提供しました。ただし、リフレクションで TaskCompletionSource にアクセスするハンドラーを動的に作成すると、課題が生じました。
カスタム DynamicMethod 呼び出し
重要な解決策には、必要なロジックを含む動的メソッドを作成することが含まれていました。このメソッドの最初のパラメータは、TaskCompletionSourceHolder インスタンスになります。これにより、生成された IL 内から TaskCompletionSource にアクセスできるようになりました。
ヘルパー クラスと拡張メソッド
ヘルパー クラス TaskCompletionSourceHolder は、TaskCompletionSource をカプセル化し、設定するメソッドを提供しました。その結果。拡張メソッド FromEvent は、ソース オブジェクトとイベント名をパラメータとして受け取りました。
サポートされるイベント タイプ
このソリューションは、パラメーター リストに関係なく、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 サイトの他の関連記事を参照してください。