AFAIK, alles was es weiß ist, dass irgendwann seine SetResult
oder SetException
Methode aufgerufen wird, um die Task<T>
Belichtung durch seine Task
Eigenschaft zu vervollständigen .
Mit anderen Worten, es fungiert als Produzent für a Task<TResult>
und dessen Fertigstellung.
Ich habe hier das Beispiel gesehen:
Wenn ich eine Möglichkeit brauche, eine Func asynchron auszuführen und eine Aufgabe zu haben, um diese Operation darzustellen.
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;
}
Welche verwendet * werden könnte , wenn ich nicht Task.Factory.StartNew
- aber ich tun haben Task.Factory.StartNew
.
Frage:
Kann jemand ein Szenario mit gutem Beispiel erklären Sie sich bitte im Zusammenhang direkt an TaskCompletionSource
und nicht auf eine hypothetische Situation , in der ich nicht habe Task.Factory.StartNew
?