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

Bagaimana untuk Mengendalikan Acara Asynchronous dalam C#?

Mary-Kate Olsen
Lepaskan: 2025-01-08 12:37:42
asal
730 orang telah melayarinya

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

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

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

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

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!

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