tôi sử dụng một tập hợp các nhiệm vụ vào những thời điểm, và để chắc chắn rằng họ đều chờ đợi tôi sử dụng phương pháp này:Tại sao ngoại lệ này không bị ném?
public async Task ReleaseAsync(params Task[] TaskArray)
{
var tasks = new HashSet<Task>(TaskArray);
while (tasks.Any()) tasks.Remove(await Task.WhenAny(tasks));
}
và sau đó gọi nó như thế này:
await ReleaseAsync(task1, task2, task3);
//or
await ReleaseAsync(tasks.ToArray());
Tuy nhiên, thời gian gần đây Tôi đã nhận thấy một số hành vi lạ và được đặt để xem có sự cố với phương thức ReleaseAsync hay không. Tôi quản lý để thu hẹp nó xuống bản demo đơn giản này, nó chạy trong linqpad nếu bạn bao gồm System.Threading.Tasks
. Nó cũng sẽ làm việc một chút sửa đổi trong một ứng dụng giao diện điều khiển hoặc trong một bộ điều khiển MVC asp.net.
async void Main()
{
Task[] TaskArray = new Task[]{run()};
var tasks = new HashSet<Task>(TaskArray);
while (tasks.Any<Task>()) tasks.Remove(await Task.WhenAny(tasks));
}
public async Task<int> run()
{
return await Task.Run(() => {
Console.WriteLine("started");
throw new Exception("broke");
Console.WriteLine("complete");
return 5;
});
}
Điều tôi không hiểu là lý do ngoại lệ không bao giờ xuất hiện ở bất kỳ đâu. Tôi đã nghĩ rằng nếu các Nhiệm vụ với ngoại lệ được chờ đợi, nó sẽ ném đi. Tôi đã có thể khẳng định điều này bằng cách thay thế các vòng lặp trong khi với một đơn giản đối với từng như thế này:
foreach(var task in TaskArray)
{
await task;//this will throw the exception properly
}
Câu hỏi của tôi là, tại sao không phải là ví dụ thể hiện ném ngoại lệ đúng cách (nó không bao giờ xuất hiện bất cứ nơi nào).
thể trùng lặp của (http://stackoverflow.com/questions/22856052/how- to-handle-task-factory-startnew-exception) –
Bất kỳ lý do nào để không sử dụng 'Task.WhenAll'? –
@PauloMorgado - Vâng, chúng được gắn với tài nguyên được quản lý và tôi muốn phát hành chúng khi chúng có sẵn thay vì chờ đợi cho tất cả chúng hoàn thành và sau đó phát hành. –