取消和重新启动任务

本文关键字:任务 重新启动 取消 | 更新日期: 2023-09-27 18:10:58

我读过一些关于这方面的文章,但我目前一无所知。我正在工作的一个应用程序,其中有一个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属性,但我认为使用单个回收任务可能是更好的选择。

取消和重新启动任务

我得到的问题是当我使用CancellationToken取消任务时,新任务无法启动

为您正在开始的每一轮工作创建一个新的CTS(和CT)。您需要将最后一轮的CTS存储在字段中。然后,开始新的工作是:

if(cts != null) cts.Cancel();
cts = new ...;
StartWork(cts.Token);

请注意,取消正在运行的任务是合作的,并且将令牌传递给Task.Run不会做任何事情,因为它不会停止已经运行的任务。