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
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!