Какова цель TaskCreationOptions с TaskCompletionSource?
Что-то неясное для меня о внутренней работе TaskCompletionSource<>
,
При создании простого Task<>
с использованием Factory
Я ожидаю, что эта задача будет поставлена в очередь в пуле потоков, если я не укажу TaskCreationOptions.LongRunning
где он будет работать в новом потоке вместо.
Мое понимание TaskCompletionSource
является то, что я отвечаю за запуск, когда задача заканчивается или не удается, и я имею полный контроль над тем, как управлять потоками. Тем не менее, ктор 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);