以下是 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 参数的构造函数,以便您可以创建任务并让它调度通过同步上下文任务调度程序?