为什么只允许在 Task 的 ContinueWith 方法中指定 TaskScheduler?

时间:2021-05-17 06:22:11

标签: c# .net

以下是 Task 类的一些 API:

public class Task : ... {
   public Task(Action action);
   public Task(Action action, CancellationToken cancellationToken);
   public Task(Action action, CancellationToken cancellationToken, TaskCreationOptions creationOptions);
   // none of overload constructors takes a TaskScheduler parameter
   ...

   public Task ContinueWith(Action<Task> continuationAction, TaskContinuationOptions continuationOptions);
   public Task ContinueWith(Action<Task> continuationAction, TaskScheduler scheduler);
   public Task ContinueWith(Action<Task> continuationAction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler);
   ...
}

我们知道 FCL 附带两种 TaskScheduler 派生类型:线程池任务调度程序和同步上下文任务调度程序。默认情况下,所有应用程序都使用线程池任务调度程序。这个任务调度器将任务调度到线程池的工作线程。

同步上下文任务调度程序通常用于具有图形用户界面的应用程序。此任务调度程序将所有任务调度到应用程序的 GUI 线程上 以便所有任务代码都可以成功更新按钮、菜单项等 UI 组件。 同步上下文任务调度器根本不使用线程池。

但是为什么我们在使用 ContinueWith 方法时只能指定 TaskScheduler 的类型,为什么 Task 没有带 TaskScheduler 参数的构造函数,以便您可以创建任务并让它调度通过同步上下文任务调度程序?

0 个答案:

没有答案