如何取消使用Task.Run()运行的现有任务?

时间:2019-10-31 14:24:12

标签: c# task

下面提到的UpdateMethod可以从各种用户操作(如按钮UpdateSW1,UpdateSW2,UpdateSW3)中调用。

如果用户单击UpdateSW1按钮,它将暂停任务10秒钟,此处的waitTime为2。现在,单击完成后,用户也可以单击UpdateSW2,这时,由于第一次单击(UpdateSW1),我想取消正在进行的任务延迟或其他操作,然后启动UpdateSW2的操作。

private void UpdateMethod(int waitTime, int actionNo)
    {
        Task.Run(async () =>
        {
            while (waitTime != 0)
            {
                waitTime--;
                await Task.Delay(5000);
            }
            // DO other stuff ...

            if (actionNO == 1)
            {
                //ops for UpdateSW1
            }
            else
            {
                //ops for UpdateSW2.
            }
        });
    }

Update1:​​

经过一番尝试,我想出了以下代码,现在在某种程度上可以正常工作,但仍需要改进。如果用户依次单击按钮UpdateSW1和UpdateSW2,然后我单击“取消”按钮,它将取消其中一个任务(由于UpdateSW1 click的结果而正在运行),但不取消另一个任务(由于单击updteSW2而正在运行)我希望取消这两个任务。如何实现这一目标。

修改后的方法:

private CancellationTokenSource cts; // declared as class variable. 

private void UpdateMethod(int waitTime, int actionNo)
    {
        cts = new CancellationTokenSource();
        CancellationToken token1 = cts.Token;
        try
        {
            Task.Run(async () =>
            {
                while (waitTime != 0)
                {
                    waitTime--;
                    await Task.Run(() => Task.Delay(5000, token1), token1);
                    token1.ThrowIfCancellationRequested();
                }
                // DO other stuff ...

                if (actionNO == 1)
                {
                    //ops for UpdateSW1
                }
                else
                {
                    //ops for UpdateSW2.
                }
            }, token1);
        }
        catch (OperationCanceledException e)
        {
            // update DB log
        }
    }

1 个答案:

答案 0 :(得分:0)

整个等待循环

import json

with open(filename) as json_file:
    all_data = json.load(json_file)

for entry in all_data:
    year = entry["Year"]
    # Do something with year

可以简化为

            while (waitTime != 0)
            {
                waitTime--;
                await Task.Run(() => Task.Delay(5000, token1), token1);
                token1.ThrowIfCancellationRequested();
            }

当令牌发出信号时,延迟将结束。无需绕行。