Quand doit-TaskCompletionSource<T> être utilisé?

Autant que je sache, tout ce qu'il sait, c'est qu'à un certain point, son SetResult ou SetException méthode est appelée à remplir le Task<T> exposée par sa Task propriété.

En d'autres termes, il agit en tant que producteur pour une Task<TResult> et de son achèvement.

J'ai vu ici l'exemple :

Si j'ai besoin d'un moyen pour exécuter une touche Func de manière asynchrone et ont une Tâche
afin de représenter cette opération.

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; 
}

Qui pourrait être utilisé *si je n'avais pas Task.Factory.StartNew -
Mais je ne ont Task.Factory.StartNew.

Question:

Quelqu'un peut expliquer, par exemple, un scénario de directement à TaskCompletionSource
et pas à un hypothétique situation dans laquelle je n'ai pas Task.Factory.StartNew?

  • TaskCompletionSource est principalement utilisé pour l'emballage de l'événement en fonction api asynchrone à la Tâche sans se faire de nouveaux Threads.
InformationsquelleAutor Royi Namir | 2013-03-09