You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何代码中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:22:52