Что-то неясно мне о внутренней работе 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;
}