使用反射從事件完成任務
非同步/等待模式允許在事件觸發時輕鬆建立任務。但是,此模式需要每個事件都有一個特定的 FromEvent 方法。為了簡化這一點,需要一個更通用的解決方案,其中一個 FromEvent 方法可以處理任何實例上的任何事件。
當直接傳遞事件或作為字串傳遞面臨限制時,反射提供了一條潛在的路徑。然而,動態創建一個處理程序來在反射中存取 TaskCompletionSource 帶來了挑戰。
自訂動態方法呼叫
關鍵的解決方案涉及建立一個包含所需邏輯的動態方法。此方法的第一個參數是 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中文網其他相關文章!