首頁 >後端開發 >C++ >反射如何簡化從事件創建非同步/等待任務?

反射如何簡化從事件創建非同步/等待任務?

Barbara Streisand
Barbara Streisand原創
2025-01-05 08:30:09291瀏覽

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

使用反射從事件完成任務

非同步/等待模式允許在事件觸發時輕鬆建立任務。但是,此模式需要每個事件都有一個特定的 FromEvent 方法。為了簡化這一點,需要一個更通用的解決方案,其中一個 FromEvent 方法可以處理任何實例上的任何事件。

當直接傳遞事件或作為字串傳遞面臨限制時,反射提供了一條潛在的路徑。然而,動態創建一個處理程序來在反射中存取 TaskCompletionSource 帶來了挑戰。

自訂動態方法呼叫

關鍵的解決方案涉及建立一個包含所需邏輯的動態方法。此方法的第一個參數是 TaskCompletionSourceHolder 實例。這允許從生成的 IL 中存取 TaskCompletionSource。

幫助器類別和擴充方法

幫助器類別 TaskCompletionSourceHolder 封裝了 TaskCompletionSource 並提供了設定方法它的結果。擴展方法 FromEvent 將來源物件和事件名稱作為參數。它:

  • 建立了一個新的 TaskCompletionSource 和 TaskCompletionSourceHolder 實例。
  • 使用反射檢索事件資訊。
  • 使用反射為事件建立委託類型。
  • 驗證傳回的委託類型void。
  • 產生了一個動態方法,將傳遞給事件處理程序的參數儲存在陣列中。
  • 呼叫了 TaskCompletionSourceHolder.SetResult 方法來設定任務的結果。
  • 已建立來自動態方法的委託並將其新增為事件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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn