Penyelesaian Tugasan daripada Peristiwa Menggunakan Refleksi
Corak async/tunggu membolehkan penciptaan tugas yang mudah selepas peristiwa penembakan. Walau bagaimanapun, corak ini memerlukan kaedah FromEvent khusus untuk setiap acara. Untuk memudahkan perkara ini, penyelesaian yang lebih umum dikehendaki, di mana satu kaedah FromEvent boleh mengendalikan sebarang peristiwa pada mana-mana kejadian.
Semasa melepasi acara secara langsung atau sebagai rentetan yang menghadapi had, refleksi menawarkan laluan yang berpotensi. Walau bagaimanapun, mencipta pengendali secara dinamik untuk mengakses TaskCompletionSource dalam refleksi menimbulkan cabaran.
Invokasi Kaedah Dinamik Tersuai
Penyelesaian utama melibatkan mencipta kaedah dinamik yang mengandungi logik yang dikehendaki. Parameter pertama kaedah ini ialah contoh TaskCompletionSourceHolder. Ini dibenarkan untuk mengakses TaskCompletionSource dari dalam IL yang dijana.
Kelas Pembantu dan Kaedah Sambungan
Kelas pembantu, TaskCompletionSourceHolder, merangkumkan TaskCompletionSource dan menyediakan kaedah untuk menetapkan hasilnya. Kaedah sambungan FromEvent mengambil objek sumber dan nama acara sebagai parameter. Ia:
Jenis Acara yang Disokong
Penyelesaian ini menyokong sebarang peristiwa pengembalian tidak sah, tanpa mengira senarai parameter. Penambahbaikan tambahan boleh dibuat untuk menyokong sebarang jenis nilai pulangan jika diperlukan.
Contoh Penggunaan
Di bawah ialah contoh cara menggunakan kaedah FromEvent tersuai:
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; }
Menggunakan kaedah FromEvent umum kami, kami boleh menentukan sebarang jenis acara tanpa memerlukan jenis tugas yang jelas, sekali gus memudahkan acara pengendalian dalam senario async/menunggu.
Atas ialah kandungan terperinci Bagaimanakah Reflection Boleh Memudahkan Async/Menunggu Penciptaan Tugasan daripada Acara?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!