使用 CancellationTokenSource 从按钮单击取消异步任务不起作用

问题描述

我需要做的是取消正在异步运行的任务。单击取消按钮时应取消任务。我已经用 CancellationTokenSource 完成了。但它不能正常工作。

public class classA 
{
    CancellationTokenSource _tokenSource = null;

    public void OnCancelButtonClick()
    {
        MessageBox.Show("Do you Really want to cancel upload");            
        _tokenSource = new CancellationTokenSource();
        _tokenSource.Cancel();
    }

    public async void UploadBtnClick(object param )
    {
        _tokenSource = new CancellationTokenSource();
        var token = _tokenSource.Token;
        try
        {
            await Task.Run(() => UploadFunction(token));
        }
        catch(OperationCanceledException ex)
        {
            MessageBox.Show(ex.Message);

        }
        finally
        {
            _tokenSource.dispose();
        }
    }

    public Task<bool> UploadFunction(CancellationToken token)
    {
        foreach
        {
            //code here

            if (token.IsCancellationRequested)
            {
                token.ThrowIfCancellationRequested();
            }
        }          
    }
}

我正在从另一个函数调用 OnCancelButtonClick

public class classB 
{
    public void CancelUploadBtnExecute(object param)
    {
        Filesviewmodel vm = new Filesviewmodel();
        vm.OnCancelButtonClick(); 
    }
}

当我点击 OnCancelButtonClick 时,IsCancellationRequestedfalse,但没有反映在 UploadFunction 中,因此任务不会停止。

解决方法

这是因为您正在 CancellationTokenSource 中初始化新的 OnCancelButtonClick()

只需从 OnCancelButtonClick()

中删除这一行
_tokenSource = new CancellationTokenSource();

UploadFunction 方法正在使用 CancellationTokenSource 方法中从 UploadBtnClick 创建的令牌。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...