Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menangkap Pengecualian daripada Kaedah Async Void dalam C#?

Bagaimanakah Saya Boleh Menangkap Pengecualian daripada Kaedah Async Void dalam C#?

DDD
DDDasal
2025-01-24 02:45:12949semak imbas

How Can I Catch Exceptions from Async Void Methods in C#?

Mengendalikan pengecualian dalam kaedah lompang tak segerak

Dalam .NET Async CTP Microsoft, kaedah tak segerak berkelakuan berbeza apabila melontar pengecualian. Dalam kaedah Tugas asynchronous atau Task tak segerak, pengecualian ditangkap dan dilampirkan pada objek Task. Walau bagaimanapun, untuk kaedah kekosongan tak segerak, tiada objek Tugas untuk mengendalikan pengecualian.

Pengecualian tangkap

Untuk menangkap pengecualian yang dilemparkan oleh kaedah kekosongan tak segerak, anda mesti menunggu secara eksplisit panggilan kaedah atau menggunakan kaedah Tunggu():

  1. Menunggu panggilan kaedah:

    <code class="language-csharp"> public async Task Foo()
     {
         var x = await DoSomethingAsync();
     }
    
     public async void DoFoo()
     {
         try
         {
             await Foo();
         }
         catch (ProtocolException ex)
         {
             // 由于在异步方法中等待了调用,因此将捕获异常。
         }
     }</code>
  2. Gunakan kaedah Tunggu():

    <code class="language-csharp"> public void DoFoo()
     {
         try
         {
             Foo().Wait();
         }
         catch (ProtocolException ex)
         {
             // 由于等待了调用的完成,因此将捕获异常。
         }
     }</code>

Ralat mengendalikan semantik

Seperti yang Stephen Cleary nyatakan, kaedah kekosongan tak segerak mempunyai semantik pengendalian ralat yang berbeza:

"Apabila kaedah async void melontarkan pengecualian, pengecualian dibangkitkan terus pada SynchronizationContext yang aktif semasa kaedah asynchronous void dimulakan."

Arahan lain

    Jika .NET melaksanakan kaedah secara serentak, menggunakan Wait() boleh menyebabkan aplikasi disekat.
  • Lihat penjelasan di bawah untuk mendapatkan butiran tentang cara pengkompil mengendalikan tingkah laku ini:
  • https://www.php.cn/link/c4d856156b2c629314b9edd13523fe8e

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menangkap Pengecualian daripada Kaedah Async Void dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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