【发布时间】:2015-09-03 14:19:52
【问题描述】:
我已经阅读了一些关于此的文章,但我目前一无所知。我正在开发一个应用程序,其中有一个位于表单上的 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 属性,但我认为使用单个回收的 Task 可能是更好的选择。
【问题讨论】:
-
您遇到了什么具体问题?似乎您所要做的就是在切换标签时取消任何未完成的工作并开始新工作。
-
我遇到的问题是当我使用 CancellationToken 取消任务时,新任务无法启动(大概是因为它使用了相同的令牌,现在设置为已取消)
标签: c# multithreading task-parallel-library task