6

Tôi có một công việc với một sự tiếp nối để xử lý các lỗi:công tác Tiếp tục (OnlyOnFaulted) vẫn được không quan sát được ngoại lệ

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 
var loadTask = Task<List<OrderItemViewModel>>.Factory.StartNew(() => 
{ 
     throw new Exception("derp"); 
}); 

var errorContinue = loadTask.ContinueWith(t => 
    { 
     MainViewModel.RemoveViewModel(this); 
    }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, uiScheduler); 

Tiếp tục là hit, nhưng vài giây sau, tôi nhận được lỗi này trong ứng dụng:

(Các) ngoại lệ của Công việc không được quan sát bằng cách chờ đợi trên Task hoặc truy cập thuộc tính Ngoại lệ của nó. Kết quả là, ngoại lệ không được trả lời đã được chỉnh sửa bởi chuỗi kết thúc.

Điều này có liên quan đến uiScheduler không? Giải pháp cho những câu hỏi tương tự về cơ bản là những gì tôi đang làm A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was

Trả lời

6

Bạn cần phải thực sự xử lý (hoặc ít nhất là quan sát) các ngoại lệ:

var errorContinue = loadTask.ContinueWith(t => 
{ 
    // Observe/acknowledge the exception. 
    // You can use t.Wait(), which throws, or just grab the exception 
    var exception = t.Exception; 
    MainViewModel.RemoveViewModel(this); 
}, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, uiScheduler); 

Điều này là do các dòng này của documentation on exception handling in the TPL:

Nếu bạn không đợi nhiệm vụ tuyên truyền ngoại lệ hoặc truy cập thuộc tính ngoại lệ, ngoại lệ sẽ được leo thang theo chính sách ngoại lệ .NET khi tác vụ được thu thập rác.

Trong trường hợp của bạn, bạn có tiếp tục, nhưng bạn không bao giờ thực sự "chờ ngoại lệ" hoặc truy cập thuộc tính ngoại lệ của nó. Lý do câu trả lời của tôi (trong câu hỏi liên quan bạn đã đăng) hoạt động là tôi thực sự đang sử dụng bằng cách sử dụng thuộc tính Ngoại lệ trên Tác vụ được chuyển qua việc tiếp tục.

+0

Microsoft đã thay đổi chính sách ngoại lệ .NET kể từ khi câu trả lời này được viết. Xem các ngoại lệ không được giám sát tại https://msdn.microsoft.com/en-us/library/hh367887.aspx#core –

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