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
- но у меня есть Task.Factory.StartNew
.
Вопрос:
Может кто - то пожалуйста , объясните на примере сценарий , связанный непосредственно с , TaskCompletionSource
а не к гипотетической ситуации , в которой у меня нет Task.Factory.StartNew
?