private readonly TaskScheduler m_syncSch;
public Form1()
{
InitializeComponent();
//获取主线程的上下文任务调度器
m_syncSch = TaskScheduler.FromCurrentSynchronizationContext();
Text = "Syste Dome";
Visible = true; Width = 400; Height = 400;
}
private CancellationTokenSource m_cts;
private void Form1_Load(object sender, EventArgs e)
{
}
private int sum(CancellationToken cancellationToken, int p)
{
Thread.Sleep(1000); //这里需要一个等待,不然你取消的时候任务已经完成了
cancellationToken.ThrowIfCancellationRequested(); ;
return p;
}
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
if (m_cts != null)
{
m_cts.Cancel();
m_cts = null;
}
else
{
Text = "running";
m_cts = new CancellationTokenSource();
//使用默认的调度器,在新任务上面
Task<int> t = Task.Run(() => sum(m_cts.Token, 200), m_cts.Token);
//使用同步上下文调度器,可以在GUI线程上面访问,可以修改主页面
t.ContinueWith(task => Text = "任务完成" ,
CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion,
m_syncSch
);
t.ContinueWith(task => Text = "任务取消",
CancellationToken.None, TaskContinuationOptions.OnlyOnCanceled,
m_syncSch
);
t.ContinueWith(task => Text = "任务抛出异常" ,
CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted,
m_syncSch
);
}
任务调度器,使用调度器的上下文,线程修改GUI控件
最新推荐文章于 2023-06-28 09:22:28 发布