Продолжение задачи неожиданное поведение - PullRequest
1 голос
/ 05 февраля 2020

посмотрите на следующий код:

Итак, я беру текущий контекст (поток WinForms), запускаю новую задачу с этим контекстом и присоединяю синхронное продолжение с планировщиком задач Default. , Насколько я понимаю, продолжение должно начинаться в потоке потоков. Поток пользовательского интерфейса не принадлежит пулу потоков. Но вместо этого весь код, включая продолжение, выполняется синхронно в одном потоке. Это довольно неожиданно для меня.

Кстати, если я установлю параметры продолжения как TaskContinuationOptions.None, он будет запущен в другом потоке, как и должно быть. Похоже, что опции продолжения отдают предпочтение планировщику задач, несмотря на то, что это всего лишь подсказки, а планировщик является требованием.

TaskScheduler uiContext = TaskScheduler.FromCurrentSynchronizationContext();
Console.WriteLine("start thread {0}", Thread.CurrentThread.ManagedThreadId);

Task.Factory.StartNew(() =>
{
    Console.WriteLine("ui thread {0}", Thread.CurrentThread.ManagedThreadId);
}, CancellationToken.None, TaskCreationOptions.None, uiContext).ContinueWith(t =>
{
    Console.WriteLine("continuation thread {0}", Thread.CurrentThread.ManagedThreadId);
}, CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);

Это ошибка или ожидаемое поведение?

Что я могу сделать для гарантированного запуск кода продолжения вне потока пользовательского интерфейса независимо от контекста родительской задачи и параметров продолжения? Какой-то пользовательский планировщик задач?

Примечание: я знаю, что это устаревший код, и async / await - это путь к go.

...