Mengatasi Pengendalian Pengecualian dalam Kaedah Async Void .NET
KaedahAsynchronous async void
dalam .NET menimbulkan cabaran unik apabila melibatkan pengurusan pengecualian. Pengecualian yang dilemparkan dalam kaedah ini tidak mudah ditangkap oleh kod panggilan, yang berpotensi membawa kepada gelagat aplikasi yang tidak dijangka atau ranap sistem. Artikel ini menggariskan strategi berkesan untuk mengurangkan isu ini.
Memahami Masalah
Isu teras terletak pada sifat async void
kaedah. Apabila pengecualian berlaku dalam kaedah async void
(cth., Foo()
), ia tidak dikendalikan secara langsung oleh pemanggil (cth., DoFoo()
). Semasa menyahpepijat, Visual Studio mungkin memaparkan amaran dan meneruskan pelaksanaan; namun, dalam persekitaran pengeluaran, ini boleh mengakibatkan kegagalan senyap atau ranap tanpa mesej ralat bermaklumat.
Penyelesaian: Tunggu atau Tunggu
Kunci untuk menangkap pengecualian daripada kaedah async void
melibatkan sama ada menunggu penyelesaian kaedah dalam kaedah async
atau menggunakan kaedah Wait()
. Kedua-dua pendekatan memastikan operasi tak segerak selesai dan memaparkan sebarang pengecualian yang dilemparkan.
Kaedah 1: Menunggu Panggilan (Diutamakan)
Pendekatan yang disyorkan memanfaatkan corak async
/await
:
<code class="language-csharp">public async Task Foo() { var x = await DoSomethingAsync(); } public async void DoFoo() { try { await Foo(); } catch (ProtocolException ex) { // Exception handled successfully. } }</code>
Dengan menunggu Foo()
dalam kaedah async
DoFoo()
, pengecualian disebarkan dengan betul dan ditangkap dalam blok try-catch
.
Kaedah 2: Menggunakan Wait()
Sebagai alternatif, kaedah Wait()
boleh digunakan:
<code class="language-csharp">public void DoFoo() { try { Foo().Wait(); } catch (ProtocolException ex) { // Exception handled successfully. } }</code>
Pendekatan ini serentak menunggu Foo()
selesai, menjadikan sebarang pengecualian boleh diakses dalam blok try-catch
.
Pertimbangan Penting
Wait()
boleh membawa kepada kelakuan menyekat jika masa jalan .NET melaksanakan kaedah secara serentak. Ini boleh memberi kesan negatif terhadap tindak balas aplikasi.async void
kaedah berbeza daripada kaedah async Task
atau async Task<T>
berkenaan pengendalian pengecualian. Pengecualian daripada kaedah async void
dinaikkan pada SynchronizationContext
aktif pada masa seruan. Ini boleh menjadikan penentuan sumber pengecualian lebih mencabar. Oleh itu, mengutamakan kaedah async Task
biasanya disyorkan untuk pengurusan pengecualian yang lebih baik.Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Pengecualian yang Dilemparkan oleh Kaedah Async Void dengan Berkesan dalam .NET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!