请看下面的代码:
Default
因此,我获取当前上下文(WinForms 线程),使用该上下文启动一个新任务,并使用任务调度程序附加一个同步延续。据我了解,延续应该从线程池线程开始。UI 线程不属于线程池。但相反,包括延续在内的所有代码都在同一个线程上同步运行。这对我来说是非常出乎意料的。
顺便说一句,如果我将延续选项设置为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);
这是错误还是预期的行为?
我可以做些什么来保证 UI 线程之外的延续代码独立于父任务上下文和延续选项运行?一些自定义任务计划程序?
注意:我知道这是一个遗留代码,并且 async/await 是要走的路。