我已经阅读了几篇关于此的文章,但我目前还不明智。我正在开发一个应用程序,该应用程序在窗体上有一个TabControl。当用户单击选项卡页时,我希望后台进程在UI线程上运行(因为该进程可能需要几分钟)。很好,但是如果用户选择其他选项卡,则我希望取消任何当前活动的任务,并引起注意以转到新的选项卡。
private void ParentTabControl_SelectedIndexChanged(object sender, EventArgs e)
{
Task testTask;
CancellationTokenSource testSource = new CancellationTokenSource();
CancellationToken testToken = testSource.Token;
switch (ParentTabControl.SelectedIndex)
{
case 0:
updateSummaryTab();
break;
case 1:
testTask = Task.Run(() =>
{
updateTabOne();
}, testToken);
break;
case 2:
updateTabTwo();
break;
}
}
如果将testSource设置为cancel,则将不再可用(尽管我知道我将需要使用某种令牌)。以前,我为每个选项卡使用了不同的BackgroundWorker,并只是检查了它的IsBusy属性,但是我认为使用单个回收的Task可能是更好的选择。
我遇到的问题是,当我使用CancellationToken取消任务时,新任务无法启动
为您开始的每一轮工作创建一个新的CTS(和CT)。您需要将最后一轮的CTS存储在字段中。然后,开始新工作是:
if(cts != null) cts.Cancel();
cts = new ...;
StartWork(cts.Token);
请注意,取消正在运行的任务是协作的,将令牌传递给Task.Run
不会执行任何操作,因为它不会停止已在运行的任务。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句