26.5.7 任务调度器
任务基础结构是很灵活的,其中TaskScheduler对象功不可没,TaskScheduler对象负责执行调度的任务,同时向Visual Studio调试器公开任务信息。FCL提供了两个派生自TaskScheduler的类型:线程池任务调度器(thread pool task scheduler)和同步上下文任务调度器(synchronization context task scheduler)。默认情况下,所有应用程序使用的都是线程池任务调度器,这个任务调度器将任务调度给线程池的工作者线程。可以查询TaskScheduler的静态Default属性来获得对默认任务调度器的一个引用。
同步上下文任务调度器通常用于Windows窗体、WPF和Silverlight应用程序。这个任务调度器将所有任务调度给应用程序的GUI线程,使所有任务代码都能成功更新UI组件,比如按钮、菜单项等。同步上下文调度器根本不使用线程池。可以查询TaskScheduler的静态FromCurrentSynchronizationContext方法来获得对一个同步上下文任务调度器的引用。
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Text = "Synchronization Context Task Scheduler Demo";
Visible = true;
Width = 400;
Height = 100;
}
private readonly TaskScheduler m_syncContextTaskScheduler = TaskScheduler.Current;
private CancellationTokenSource m_cts;
protected override void OnMouseClick(MouseEventArgs e)
{
if (m_cts != null)
{
m_cts.Cancel();
m_cts = null;
}
else
{
Text = "Operation running";
m_cts = new CancellationTokenSource();
var t = new Task<int>(() => ThreadStudy.Program.Sum(m_cts.Token, 10), m_cts.Token);
t.Start();
t.ContinueWith(task => Text = "Result: " + task.Result, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, m_syncContextTaskScheduler);
t.ContinueWith(task => Text = "Operation Canceled", CancellationToken.None, TaskContinuationOptions.OnlyOnCanceled, m_syncContextTaskScheduler);
t.ContinueWith(task => Text = "Operation faulted", CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, m_syncContextTaskScheduler);
}
base.OnMouseClick(e);
}
}
}