为何代码中TaskScheduler.Current与UI TaskScheduler不相等?
问题原因解析
1. 为什么uiTaskScheduler == TaskScheduler.Current返回false?
TaskScheduler.FromCurrentSynchronizationContext()每次调用都会生成一个全新的TaskScheduler实例,哪怕它们绑定的是同一个UI同步上下文。你代码里:
- 第一行
uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext()创建了第一个实例 - 第二行
new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext())又创建了第二个实例 - 在
ui.StartNew的委托里,TaskScheduler.Current拿到的是TaskFactory内部持有的第二个实例
这两个实例是不同的对象,所以引用比较==会返回false,但它们的功能完全一致——都能把任务调度到UI线程执行,这也是你看到所有代码都跑在UI线程(线程1)的原因。
2. 为什么后台任务也在UI线程执行?
你内部的Task.Factory.StartNew没有指定任务调度器,它默认会使用TaskScheduler.Current。而此时Current就是UI任务调度器,所以这个后台任务也被安排到UI线程执行了。如果想让它跑在后台线程,应该用Task.Run(默认使用TaskScheduler.Default),或者显式指定调度器:
Task.Factory.StartNew(() => { Debug.WriteLine("Background work on thread " + Environment.CurrentManagedThreadId); }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
内容的提问来源于stack exchange,提问作者Marcin
相关产品推荐
相关产品推荐

