Prosedur pemprosesan acara: Sekiranya ia dielakkan?
async void
Secara umum, cadangan amalan terbaik untuk mengelakkan menggunakan kaedah , terutamanya apabila memulakan tugas, kerana mereka tidak mempunyai mekanisme penjejakan dan tugas gantung, dan pemprosesan yang tidak normal lebih rumit. Tetapi adakah prinsip ini digunakan untuk program pemprosesan acara
async void
mari kita lihat contoh: async void
Daripada menggunakan kaedah ini, lebih baik untuk mengubah reka bentuk kod untuk mencapai penjejakan tugas dan membatalkan fungsi:
<code class="language-csharp">private async void Form_Load(object sender, System.EventArgs e) { await Task.Delay(2000); // 执行异步操作 // ... }</code>
Di samping masalah re -incoming yang berpotensi, apakah perangkap tersembunyi dalam prosedur pemprosesan insiden
?<code class="language-csharp">Task onFormLoadTask = null; // 跟踪任务,可以实现取消 private void Form_Load(object sender, System.EventArgs e) { this.onFormLoadTask = OnFormLoadTaskAsync(sender, e); } private async Task OnFormLoadTaskAsync(object sender, System.EventArgs e) { await Task.Delay(2000); // 执行异步操作 // ... }</code>
Kuncinya ialah penggunaan async void
dipujuk dalam konteks yang tidak boleh elegan untuk mengendalikan keabnormalan. Walau bagaimanapun, dalam prosedur pemprosesan peristiwa, keabnormalan akan diproses dengan mengarahkan ke pemprosesan abnormal global untuk memastikan bahawa mereka ditangkap dan diproses dengan sewajarnya tanpa rawatan ralat eksplisit dalam program pemprosesan acara itu sendiri. Ini adalah perbezaan utama antara dalam keadaan tertentu ini.
Untuk menguji unit, pendekatan biasa adalah untuk mengekstrak semua logik semua async void
kaedah untuk pengasingan: async void
biasanya tidak disyorkan, mereka boleh diterima untuk menggunakannya dalam program pemprosesan acara async void
, kerana rangka kerja program pemprosesan peristiwa mempunyai mekanisme pemprosesan yang tidak normal. Oleh itu, anda boleh menggunakan
<code class="language-csharp">public async Task OnFormLoadAsync(object sender, EventArgs e) { await Task.Delay(2000); ... } private async void Form_Load(object sender, EventArgs e) { await OnFormLoadAsync(sender, e); }</code>
Atas ialah kandungan terperinci Sekiranya anda mengelakkan pengendali acara async void?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!