Ошибка в TPL — TaskContinuationOptions.ExecuteSynchronously?

Кажется, я заметил серьезную ошибку в TPL. Я не уверена. Я провел много времени, царапая голову и не могу понять поведение. Кто-нибудь может помочь?

Мой сценарий:

  1. Я создаю задачу, которая делает простую вещь. Никаких исключений и т. д.
  2. Я регистрирую продолжение с установленным ExecuteSynchronously. Он должен быть в той же теме.
  3. Я запускаю задачу в планировщике задач по умолчанию (ThreadPool). Стартовый поток продолжается и ждет его.
  4. Запуск задачи. Проходит.
  5. Продолжение начинается в том же потоке, что и задача (что делает предыдущую задачу завершенной!) и входит в бесконечный цикл.
  6. С ожидающим потоком ничего не происходит. Дальше идти не хочет. Застрял в ожидании. Я проверил в отладчике, задача RunToCompletion.

Вот мой код. Ценим любую помощь!

// note: using new Task() and then Start() to avoid race condition dangerous
// with TaskContinuationOptions.ExecuteSynchronously flag set on continuation.

var task = new Task(() => { /* just return */ });
task.ContinueWith(
   _task => { while (true) { } /* never return */ },
   TaskContinuationOptions.ExecuteSynchronously);

task.Start(TaskScheduler.Default);
task.Wait(); // a thread hangs here forever even when EnterEndlessLoop is already called. 
8
задан James Manning 27 May 2012 в 17:40
поделиться