我已经阅读了一些关于此的文章,但我目前没有任何明智之举。我正在制作一个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取消,那么这将不再使用(虽然我知道我将需要使用某种形式的令牌)。我之前为每个选项卡使用了不同的BackgroundWorker,并简单地检查了它的IsBusy属性,但我认为使用单个回收的任务可能是更好的选择。
你有什么具体问题?似乎所有你需要做的是取消任何杰出的工作,当标签切换并开始新的工作。 – usr
我得到的问题是当我使用CancellationToken取消任务时,新任务无法启动(可能是因为它使用相同的标记,现在设置为取消) –