посмотрите на следующий код:
Итак, я беру текущий контекст (поток 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.