AFAIK, wszystko, co wie, to to, że w pewnym momencie wywoływana jest jego metoda SetResult
lub SetException
metoda w celu uzupełnienia Task<T>
ekspozycji poprzez swoją Task
właściwość.
Innymi słowy, działa jako producent dla Task<TResult>
i jego ukończenia.
Widziałem tutaj przykład:
Jeśli potrzebuję sposobu, aby wykonać Func asynchronicznie i mam zadanie reprezentujące tę operację.
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;
}
Które mogłyby zostać wykorzystane * jeśli nie mam Task.Factory.StartNew
- Ale ja nie mam Task.Factory.StartNew
.
Pytanie:
Może ktoś proszę wyjaśnić na przykładzie scenariusza związanego bezpośrednio do TaskCompletionSource
i nie do hipotetycznej sytuacji, w której nie mam Task.Factory.StartNew
?