取消和重新启动任务
Cancelling and restarting a task
我已经阅读了几篇关于此的文章,但我目前 none-最聪明。我正在处理表单上有一个 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 属性,但我认为使用单个回收任务可能是更好的选择。
The problem I get is when I cancel the task using the CancellationToken, the new task fails to launch
为您开始的每一轮工作创建一个新的 CTS(和 CT)。您需要将最后一轮的 CTS 存储在一个字段中。那么,开始新的工作是:
if(cts != null) cts.Cancel();
cts = new ...;
StartWork(cts.Token);
请注意,取消 运行 任务是合作的,将令牌传递给 Task.Run
不会执行任何操作,因为它不会停止已经 运行 的任务。
我已经阅读了几篇关于此的文章,但我目前 none-最聪明。我正在处理表单上有一个 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 属性,但我认为使用单个回收任务可能是更好的选择。
The problem I get is when I cancel the task using the CancellationToken, the new task fails to launch
为您开始的每一轮工作创建一个新的 CTS(和 CT)。您需要将最后一轮的 CTS 存储在一个字段中。那么,开始新的工作是:
if(cts != null) cts.Cancel();
cts = new ...;
StartWork(cts.Token);
请注意,取消 运行 任务是合作的,将令牌传递给 Task.Run
不会执行任何操作,因为它不会停止已经 运行 的任务。