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?

questionAnswers(10)

yourAnswerToTheQuestion