Tôi đang cố gắng quấn quanh đầu TPL, các tính năng async
/await
mới trong C# 5 và những bí ẩn của TaskCompletionSource
.TaskCompletionSource: Khi nào sử dụng SetResult() so với TrySetResult(), v.v.
Một điều mà không phải là rõ ràng với tôi là khi nào sử dụng SetResult
, SetException
, và SetCancel
so TrySetResult
, TrySetException
và TrySetCancel
.
Đây là những gì MSDN đã nói:
Thao tác này sẽ trả về false nếu Task là đã có trong một trong ba trạng thái cuối: RanToCompletion, đứt gãy, hoặc bị hủy.
Phương pháp này cũng trả về false nếu Tác vụ cơ bản có đã được xử lý.
Ok, tôi hiểu điều đó, nhưng nó thực sự không đưa ra bất kỳ hướng dẫn nào về thời điểm hoặc lý do sử dụng cái kia.
Vì vậy, thỏa thuận là gì?
tức là, lý do duy nhất bạn cần gọi là 'TrySetResult' là nếu bạn đặt kết quả nhiều lần. 'SetResult'" hoàn thành "liên kết' Task' để gọi 'SetResult' một lần nữa sẽ cố gắng thiết lập kết quả' Task 'sau khi tác vụ đã hoàn thành. ('SetResult' khối cho đến khi' Task' hoàn thành - cũng như 'TrySetResult') Nếu bạn chỉ bao giờ gọi' SetResult' một lần, sau đó bạn sẽ không bao giờ cần 'TrySetResult'. FWIW. Chuỗi 'SetResult' thành' TrySetResult' ... –
Xin cảm ơn các bạn, các bạn đang tạo ra rất nhiều ý nghĩa! – HolySamosa
Cũng lưu ý rằng SetResult trả về 'void' trong khi TrySetResult trả về' bool' vì vậy nếu bạn muốn làm điều gì đó tùy thuộc vào trạng thái nhiệm vụ, thì 'TrySetResult' vừa được kiểm tra vừa thiết lập cùng lúc (nguyên tử?). – chakrit