2011-08-18 24 views
5

Khi đợi Tác vụ bằng Task.WaitAll và chỉ định thời gian chờ nếu WaitAll hết thời gian, tôi cũng phải theo dõi riêng các tác vụ chưa hoàn thành (ví dụ: bằng cách đăng ký tiếp tục)?Tác vụ và tác vụ.WaitAll với xử lý ngoại lệ hết giờ

This thread dẫn tôi nghĩ câu trả lời là có, nhưng tôi chưa tìm thấy bất kỳ điều gì khác xác nhận điều này.

var random = new Random(); 
var tasks = Enumerable.Range(0, 10).Select((i) => Task.Factory.StartNew(() => { 
     // Sleep 5-15 seconds 
     Thread.Sleep(random.Next(5000, 15000)); 
     throw new Exception("Some exception."); 
    } 
)).ToArray(); 

try { 
    // Wait for 10 seconds 
    Task.WaitAll(tasks, 10000); 
} catch (AggregateException) { 
    // Swallow 
} 

// Check to see how many tasks were unfinished 
tasks.Where(t => !t.IsCompleted).Count().Dump("Unfinished count: "); 

// Is this neccessary to avoid exceptions being thrown on the finalizer? 
foreach (Task task in tasks) { 
    task.ContinueWith(t => t.Exception, TaskContinuationOptions.OnlyOnFaulted); 
} 
+0

Có bao nhiêu trường hợp ngoại lệ trong Tổng quan ngoại lệ mà bạn nắm bắt sau WaitAll? –

+0

Nguồn lib đơn giản hoàn chỉnh tại đây: http://stackoverflow.com/questions/11831844/unobservedtaskexception-being-throw-but-it-is-handled-by-a-taskscheduler-unobser –

Trả lời

0

Testing với LINQPad v4.31 chỉ ra câu trả lời là có, vì nếu bạn nhận xét ra foreach bạn nhận được một hộp thoại ngoại lệ unhandled cho mỗi công việc còn dang dở.

Tôi tin rằng tôi hiểu lý do tại sao điều này là vào thời điểm này nhưng nếu ai muốn có một giải thích kỹ thuật hơn về hành vi này bằng mọi cách, hãy đi cho nó.

2

Để tránh gặp lỗi trình kết thúc, bạn phải quan sát các trường hợp ngoại lệ được ném bởi cơ thể Task. Để quan sát một ngoại lệ Task bạn phải làm một trong những điều sau đây:

  1. Truy cập diễn đàn bất động sản ngoại lệ
  2. Gọi Task.Wait/WaitAll/WaitAny
  3. đăng ký một sự tiếp nối mà chỉ chạy nếu nhiệm vụ faulted

Những gì bạn đã làm chắc chắn là cần thiết để tránh làm hỏng trình hoàn thiện.

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