Подтвердить что ты не робот

Какова цель 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;
}
4b9b3361

Ответ 1

Ответ заключается в том, что TaskCreationOption полезен только для параметра AttachToParent, поскольку TaskCompletionSource может быть дочерним элементом любой другой задачи. Параметры, связанные с управлением потоками или выполнением заказов, не имеют отношения к контексту объекта TaskCompletionSource. Следующий код действительно генерирует исключение:

new TaskCompletionSource<WebResponse>(TaskCreationOptions.LongRunning);