Pengendalian pengecualian kaedah kekosongan tak segerak dalam C#
Apabila menggunakan CTP tak segerak .NET, adalah penting untuk memahami cara pengecualian dikendalikan di dalam dan di luar kaedah tak segerak, terutamanya apabila berurusan dengan kaedah lompang tak segerak.
Penyebaran pengecualian dalam kaedah tak segerak
Dalam kod C# yang disediakan, kaedah kekosongan tak segerak bernama Foo() dilaksanakan secara tak segerak, dan ia dipanggil oleh kaedah bukan tak segerak DoFoo(). Dalam Foo(), jika pengecualian (seperti ProtocolException) dilemparkan, ia tidak disebarkan secara automatik ke DoFoo(). Ini kerana kaedah kekosongan asynchronous tidak mengembalikan objek Tugas yang boleh ditunggu.
Kendalikan pengecualian dalam kaedah panggilan
Untuk menangkap pengecualian yang dilemparkan daripada kaedah kekosongan tak segerak dalam kaedah panggilan, anda mesti:
Tunggu panggilan dalam kaedah tak segerak:
Ubah suai kaedah DoFoo() untuk menjadikannya tak segerak dan gunakan await Foo(). Ini akan menunggu untuk Foo() menyelesaikan dan menangkap sebarang pengecualian yang mungkin dilemparkan.
Penyegerakan menunggu untuk selesai:
Gunakan kaedah Tunggu() hasil Foo() dalam DoFoo(). Ini akan menyekat benang sehingga operasi tak segerak selesai dan membuang sebarang pengecualian yang berlaku.
Contoh penggunaan menunggu:
<code class="language-csharp">public async void DoFoo() { try { await Foo(); // 因为您已 await,所以会捕获异常 } catch (ProtocolException ex) { // 处理异常 } }</code>
Contoh menggunakan Tunggu:
<code class="language-csharp">public void DoFoo() { try { Foo().Wait(); // 因为您已等待,所以会捕获异常 } catch (ProtocolException ex) { // 处理异常 } }</code>
Perlu diingat bahawa menggunakan Tunggu boleh menyebabkan masalah penyegerakan yang berpotensi kerana ia menyekat urutan sehingga operasi selesai. Adalah disyorkan untuk menggunakan kaedah await
terlebih dahulu untuk mengelak daripada menyekat urutan dan meningkatkan responsif program.
Atas ialah kandungan terperinci Bagaimanakah Saya Mengendalikan Pengecualian yang Dilemparkan oleh Kaedah Async Void dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!