AFAIK, tudo o que sabe é que, em algum momento, seu SetResult
ou SetException
método está sendo chamado para concluir o Task<T>
exposto por meio de sua Task
propriedade.
Em outras palavras, ele atua como produtor de uma Task<TResult>
e sua conclusão.
Eu vi aqui o exemplo:
Se eu precisar de uma maneira de executar um Func de forma assíncrona e ter uma tarefa para representar essa operação.
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;
}
Que poderia ser usado * se eu não tinha Task.Factory.StartNew
- Mas eu não tenho Task.Factory.StartNew
.
Questão:
Alguém pode explicar por exemplo um cenário relacionado diretamente ao TaskCompletionSource
e não a uma hipotética situação em que eu não tenho Task.Factory.StartNew
?