AFAIK, tất cả những gì nó biết là tại một số điểm, phương thức SetResult
hoặc SetException
phương thức của nó đang được gọi để hoàn thành việc Task<T>
tiếp xúc thông qua Task
tài sản của nó .
Nói cách khác, nó đóng vai trò là nhà sản xuất cho một Task<TResult>
và hoàn thành.
Tôi thấy ở đây ví dụ:
Nếu tôi cần một cách để thực thi Func không đồng bộ và có một Tác vụ để thể hiện thao tác đó.
public static Task<T> RunAsync<T>(Func<T> function)
{
if (function == null) throw new ArgumentNullException(“function”);
var tcs = new TaskCompletionSource<T>();
ThreadPool.QueueUserWorkItem(_ =>
{
try
{
T result = function();
tcs.SetResult(result);
}
catch(Exception exc) { tcs.SetException(exc); }
});
return tcs.Task;
}
Mà có thể được sử dụng * nếu tôi không có Task.Factory.StartNew
- Nhưng tôi làm có Task.Factory.StartNew
.
Câu hỏi:
Có thể ai đó xin vui lòng giải thích bằng ví dụ một kịch bản liên quan trực tiếp đến TaskCompletionSource
chứ không phải một giả thuyết tình huống trong đó tôi không có Task.Factory.StartNew
?