Когда должен использоваться TaskCompletionSource?
AFAIK, все, что он знает, - это то, что в какой-то момент его метод SetResult
или SetException
вызывается для завершения Task<T>
, отображаемого через его свойство Task
.
Иными словами, он выступает в качестве производителя для Task<TResult>
и его завершения.
Я видел здесь пример:
Если мне нужен способ выполнить Func асинхронно и выполнить задачу для представления этой операции.
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;
}
который можно использовать , если у меня не было Task.Factory.StartNew
Но у меня do есть Task.Factory.StartNew
.
Может кто-нибудь объяснить на примере сценарий, связанный напрямую с TaskCompletionSource
а не гипотетической ситуации, в которой у меня нет Task.Factory.StartNew
?