Какова цель 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);
Другие вопросы по тегам