2014-06-26 25 views
11

Tôi nghĩ rằng các phương pháp không đồng bộ được cho là hành xử giống như các phương pháp bình thường cho đến khi chúng được chờ đợi.Tại sao các phương pháp không đồng bộ không được khuyến khích không ném ngoại lệ?

Tại sao điều này không loại trừ ngoại lệ?

Có cách nào để loại bỏ ngoại lệ mà không phải đợi không?

using System; 
using System.Threading.Tasks; 

public class Test 
{ 
    public static void Main() 
    { 
     var t = new Test(); 
     t.Helper(); 
    } 

    public async Task Helper() 
    { 
     throw new Exception(); 
    } 
} 
+1

Là một ghi chú lịch sử, ngoại lệ ban đầu được nêu "trực tiếp" như bạn mong đợi. Tuy nhiên, hành vi này đã gây nhầm lẫn bởi vì các ngoại lệ trước và sau khi 'await' sẽ hành xử khác nhau, và nó có thể nhận được * thực sự * khó hiểu nếu' await' có điều kiện. –

+0

@StephenCleary Khi nào nó đã thay đổi? Trong giai đoạn CTP? – i3arnon

+1

@ I3arnon: Có; IIRC chỉ CTP đầu tiên xử lý theo cách này. –

Trả lời

14

Một ngoại lệ được ném bên trong phương thức async theo thiết kế được lưu trữ bên trong tác vụ trả lại. Để có được bàn tay của bạn trên ngoại trừ bạn có thể:

  1. await nhiệm vụ: await t.Helper();
  2. Wait nhiệm vụ: t.Helper().Wait();
  3. Kiểm tra của nhiệm vụ Exception tài sản sau nhiệm vụ đã được hoàn thành: var task = t.Helper(); Log(task.Exception);
  4. Thêm phần tiếp tục cho công việc xử lý ngoại lệ đó: t.Helper().ContinueWith(t => Log(t.Exception), TaskContinuationOptions.OnlyOnFaulted);

Tùy chọn tốt nhất của bạn là tùy chọn đầu tiên. Đơn giản chỉ cần await nhiệm vụ và xử lý các trường hợp ngoại lệ (trừ khi có một lý do cụ thể bạn không thể làm điều đó). Nhiều hơn trong Task Exception Handling in .NET 4.5

Các vấn đề liên quan