Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengendalikan Acara Asynchronous dalam C#?

Bagaimana untuk Mengendalikan Acara Asynchronous dalam C#?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-08 12:37:42766semak imbas

How to Handle Asynchronous Events in C#?

Penjelasan terperinci tentang pemprosesan acara tak segerak C#

Pengenalan

Mekanisme acara C# ialah alat yang berkuasa untuk mengendalikan operasi tak segerak. Walau bagaimanapun, acara tradisional adalah tidak sah, yang menjadikannya mustahil untuk menunggu pelaksanaannya selesai. Artikel ini meneroka beberapa cara alternatif untuk melaksanakan pengendalian peristiwa tak segerak.

Cabaran

Pertimbangkan coretan kod berikut, di mana peristiwa penutupan perlu dikendalikan dengan tugas tak segerak:

<code class="language-csharp">public event EventHandler<EventArgs> GameShuttingDown;

public async Task ShutdownGame()
{
    // ...
    await this.NotifyGameShuttingDown();
    await this.SaveWorlds();
    this.NotifyGameShutDown();
    // ...
}

private async Task SaveWorlds()
{
    // ...
}</code>

Masalahnya ialah NotifyGameShuttingDown pengendali acara tidak kembali dan memanggilnya dalam kaedah ShutdownGame akan menghalang tugas simpan tak segerak daripada selesai sebelum acara itu dicetuskan.

Penyelesaian 1: Perwakilan acara tak segerak tersuai

Salah satu cara ialah dengan mentakrifkan perwakilan acara tersuai yang mengembalikan Tugasan, membenarkan pelaksanaan pengendali menunggu:

<code class="language-csharp">public event Func<object, EventArgs, Task> Shutdown;</code>

Dalam kaedah ShutdownGame, pengendali boleh dipanggil seperti ini:

<code class="language-csharp">Func<object, EventArgs, Task> handler = Shutdown;

if (handler == null)
{
    return;
}

Delegate[] invocationList = handler.GetInvocationList();
Task[] handlerTasks = new Task[invocationList.Length];

for (int i = 0; i < invocationList.Length; i++)
{
    handlerTasks[i] = ((Func<object, EventArgs, Task>)invocationList[i])(this, EventArgs.Empty);
}

await Task.WhenAll(handlerTasks);</code>

Penyelesaian 2: Kaedah berasaskan pendaftaran

Pilihan lain ialah menggunakan pendekatan berasaskan pendaftaran, di mana panggilan balik boleh didaftarkan dan dilaksanakan secara tak segerak:

<code class="language-csharp">private List<Func<Task>> ShutdownCallbacks = new List<Func<Task>>();

public void RegisterShutdownCallback(Func<Task> callback)
{
    this.ShutdownCallbacks.Add(callback);
}

public async Task Shutdown()
{
    var callbackTasks = new List<Task>();
    foreach (var callback in this.ShutdownCallbacks)
    {
        callbackTasks.Add(callback());
    }

    await Task.WhenAll(callbackTasks);
}</code>

Nota

  • Kesan Reka Bentuk: Menggunakan pengendali acara tak segerak boleh mengubah reka bentuk aplikasi anda, jadi pertimbangkan potensi impak dengan teliti.
  • Kerumitan: Kaedah perwakilan tersuai menambah kerumitan tambahan, tetapi ia memastikan keserasian dengan corak acara sedia ada.
  • Prestasi: Pendekatan berasaskan pendaftaran mungkin lebih cekap kerana ia mengelakkan overhed refleksi semasa memanggil pengendali.

Disyorkan

Pendekatan yang disyorkan bergantung pada keperluan khusus aplikasi. Untuk asas kod sedia ada dan reka bentuk berasaskan peristiwa yang banyak, kaedah perwakilan tersuai lebih diutamakan. Untuk aplikasi baharu atau aplikasi yang tidak bergantung pada acara, pendekatan berasaskan pendaftaran boleh memberikan prestasi dan fleksibiliti yang lebih baik.

Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Acara Asynchronous dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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