Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Reflection Boleh Memudahkan Async/Menunggu Penciptaan Tugasan daripada Acara?

Bagaimanakah Reflection Boleh Memudahkan Async/Menunggu Penciptaan Tugasan daripada Acara?

Barbara Streisand
Lepaskan: 2025-01-05 08:30:09
asal
298 orang telah melayarinya

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

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:

  • Mencipta TaskCompletionSource dan instance TaskCompletionSourceHolder baharu.
  • Mendapatkan semula maklumat acara menggunakan refleksi.
  • Mencipta jenis perwakilan untuk acara menggunakan refleksi.
  • Sahkan bahawa jenis perwakilan dikembalikan void.
  • Menghasilkan kaedah dinamik yang menyimpan argumen yang dihantar kepada pengendali acara dalam tatasusunan.
  • Menggunakan kaedah TaskCompletionSourceHolder.SetResult untuk menetapkan hasil tugasan.
  • Dibuat perwakilan daripada kaedah dinamik dan menambahkannya sebagai acara pengendali.

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;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan