Quando deve TaskCompletionSource <T> ser usado?
AFAIK, tudo o que sabe é que em algum momento, a suaSetResult
ouSetException
método está sendo chamado para completar oTask<T>
exposta através da suaTask
propriedade.
Em outras palavras, ele age como o produtor de umTask<TResult>
e sua conclusão.
eu viAqui 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 tivesseTask.Factory.StartNew
- Mas euFaz terTask.Factory.StartNew
.
Questão:
Alguém pode por favor explicar por exemplo um cenário relacionadodiretamente paraTaskCompletionSource
e não a umhipotético situação em que não tenhoTask.Factory.StartNew
?