Tôi có một phương pháp với cơ cấu như sau:công tác tổng hợp và xử lý lỗi với TPL
public Task InitializeAsync()
{
var taskCompletionSource = new TaskCompletionSource<bool>();
Task firstTask = ...;
// secondTask calls taskCompletionSource.TrySetResult(true) once it considers itself "done"
Task secondTask = firstTask.ContinueWith(..., TaskContinuationOptions.OnlyOnRanToCompletion);
Action<TasK> errorContinuation = x =>
{
taskCompletionSource.SetException(e.Exception);
};
firstTask.ContinueWith(errorContinuation, TaskContinuationOptions.OnlyOnFaulted);
secondTask.ContinueWith(errorContinuation, TaskContinuationOptions.OnlyOnFaulted);
return taskCompletionSource.Task;
}
Quan trọng:
- nhiệm vụ được trả về bởi
InitializeAsync
không được xem là hoàn thành cho đến khi secondTask quyết định để secondTask
chỉ chạy nếufirstTask
thành công- lỗi của
firstTask
hoặcsecondTask
làm cho tác vụ tổng thể thất bại
Điều tôi đang tự hỏi là liệu có một cách đơn giản, rõ ràng hơn để thể hiện điều này trong khi đạt được cùng một chức năng hay không. Tôi đang sử dụng .NET 4.0 nhưng tôi quan tâm đến việc liệu 4.5 có làm cho việc này dễ dàng hơn không.
in 4.5 bạn có thể thực hiện việc này với các tính năng đang chờ/không đồng bộ và thử/bắt bằng cách chỉ cần cắm các tác vụ vào bên trong hàm async – Carsten
Tôi đã gặp vấn đề tương tự gần đây và đi xuống cùng một tuyến đường cho đến khi tôi tìm thấy bài đăng blog của Stephen Làm phiền câu trả lời của Gideon liên kết đến. Đó là sạch hơn và rõ ràng hơn xử lý tất cả các trường hợp góc hơn nỗ lực ban đầu của tôi tại một giải pháp. – shambulator