Какова цель TaskCreationOptions с помощью TaskCompletionSource?
Что-то неясно мне о внутренней работе TaskCompletionSource<>
.
При создании простого Task<>
с помощью Factory
я ожидаю, что эта задача будет помещена в пул потоков, если я не укажу TaskCreationOptions.LongRunning
, где она будет выполняться в новом потоке.
Мое понимание TaskCompletionSource
заключается в том, что я отвечаю за запуск при завершении задачи или сбоях, и я полностью контролирую, как управлять потоками.
Тем не менее, ctor TaskCompletionSource
позволяет мне указать TaskCreationOptions
, и это меня смущает, так как я ожидал, что Scheduler
не сможет обрабатывать задачу.
Какова цель TaskCreationOptions
в контексте TaskCompletionSource<>
?
Вот пример использования:
public Task<WebResponse> Download(string url)
{
TaskCompletionSource<WebResponse> tcs =
new TaskCompletionSource<WebResponse>(TaskCreationOptions.LongRunning);
var client = (HttpWebRequest)HttpWebRequest.Create(url);
var async = client.BeginGetResponse(o =>
{
try
{
WebResponse resp = client.EndGetResponse(o);
tcs.SetResult(resp);
}
catch (Exception ex)
{
tcs.SetException(ex);
}
}, null);
return tcs.Task;
}
Ответы
Ответ 1
Ответ заключается в том, что TaskCreationOption полезен только для параметра AttachToParent, поскольку TaskCompletionSource может быть дочерним элементом любой другой задачи.
Параметры, связанные с управлением потоками или выполнением заказов, не имеют отношения к контексту объекта TaskCompletionSource. Следующий код действительно генерирует исключение:
new TaskCompletionSource<WebResponse>(TaskCreationOptions.LongRunning);