Tôi đang chuyển đổi một số mã async/await thành chuỗi nhiệm vụ, vì vậy tôi có thể sử dụng nó trong khung công tác đã phát hành. Mã chờ đợi trông như thế nàyChuỗi nhiệm vụ không có TaskCompletionSource?
public async Task<TraumMessage> Get() {
var message = await Invoke("GET");
var memorized = await message.Memorize();
return memorized;
}
nơi
Task<TraumMessage> Invoke(string verb) {}
Task<TraumMessage> Memorize() {}
Tôi đã hy vọng để chuỗi Invoke
và Memorize
để trả lại nhiệm vụ sản xuất bởi Memorize
, nhưng có kết quả trong một Task<Task<TraumMessage>
. Các giải pháp tôi đã kết thúc là một TaskCompletionSource<TraumMessage>
như tín hiệu của tôi:
public Task<TraumMessage> Get() {
var completion = new TaskCompletionSource<TraumMessage>();
Invoke("GET").ContinueWith(t1 => {
if(t1.IsFaulted) {
completion.SetException(t1.Exception);
return;
}
t1.Result.Memorize().ContinueWith(t2 => {
if(t2.IsFaulted) {
completion.SetException(t2.Exception);
return;
}
completion.SetResult(t2.Result);
});
});
return completion.Task;
}
Có cách nào để thực hiện điều này mà không có sự TaskCompletionSource
?
Nhờ loạt bài EduAsync của Jon Skeet, tôi đã xem xét dưới sự che chở của async/await và về cơ bản nó xây dựng một lớp chạy một máy trạng thái. Tôi đã sử dụng cách tiếp cận đó trước đây, nhưng nó thậm chí còn tẻ nhạt hơn cách tiếp cận TCS. –
Ah, tốt, tôi nghĩ về điều này một bó nhiều hơn và không có cách nào với sự tiếp tục thuần túy trừ khi bạn muốn chặn việc tiếp tục nhiệm vụ thứ nhất đang chờ kết quả của việc tiếp tục nhiệm vụ thứ hai. Nếu các ngôi sao được sắp xếp làm việc có thể có nghĩa là có rất ít chi phí trong đó, nhưng vì bạn về mặt lý thuyết không có đầu mối như thế nào nhiệm vụ thứ 2 được tạo ra (có thể là một kế hoạch nhiệm vụ hoàn toàn khác hoặc APM chẳng hạn) không có bảo đảm cho điều đó. Vì vậy, bạn phải thừa nhận rằng bạn đang chặn một chuỗi đang chờ kết quả. Nếu bạn muốn xem những gì tôi có nghĩa là cho tôi biết và tôi sẽ cập nhật câu trả lời của tôi. –
Tại http://blogs.msdn.com/b/pfxteam/archive/2010/11/21/10094564.aspx Stephen Taub kết thúc tốt đẹp 'TaskCompletionSource' trong phương thức trợ giúp có tên 'Then' để triển khai mẫu này. – Govert