Все, що він знає, AFAIK - це те, що в якийсь момент його SetResult
або SetException
метод викликають для завершення Task<T>
викритого через його Task
властивість.
Іншими словами, він виступає як виробник для Task<TResult>
та його завершення.
Я бачив тут приклад:
Якщо мені потрібен спосіб виконати функцію асинхронно і мати завдання для представлення цієї операції.
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;
}
Що можна було б використовувати * , якщо у мене не було Task.Factory.StartNew
- Але я ж є Task.Factory.StartNew
.
Питання:
Може хто - то будь ласка , поясніть на прикладі сценарій , пов'язаний безпосередньо з , TaskCompletionSource
а не до гіпотетичної ситуації , в якій у мене немає Task.Factory.StartNew
?