微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 使用进度将取消令牌添加到异步任务

我使用下面的代码WPF页面异步方式中执行耗时的操作以及向UI报告进度

private void btnStart_Click(object sender,RoutedEventArgs e)
    {
        txt_importStatus.Text = "";
        var progress = new Progress<string>(progress_info =>
        {
            //show import progress on a textfield
            txt_importStatus.Text = progress_info + Environment.NewLine + "Please dont close this window while the system processing the excel file contents";              
        });
        // DoProcessing is run on the thread pool.
        await Task.Run(() => DoProcessing(progress));
    }

    public void DoProcessing(IProgress<string> progress)
    {

        //read an excel file and foreach excel file row
        foreach(excelrow row in excelrowlist)
        {
            //do db entry and update UI the progress like 
            progress.Report("Processed x number of records. please wait..");    
        }  
    }

现在我想添加一个额外的选项,在中间取消这个异步操作.为此我发现我必须添加以下选项

CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;    
private void btnCacnel_Click(object sender,RoutedEventArgs e)
{
    tokenSource.Cancel();
}

但是如何将此tokenSource传递给我的DoProcessing调用以及如何在DoProcessing中处理取消

解决方法

实际上,您不需要将CancellationTokenSource传递给DoProcessing,而只需要将CancellationToken传递给DoProcessing.

为了处理取消,您可以执行以下操作:

public void DoProcessing(CancellationToken token,IProgress<string> progress)
    {
        //read an excel file and foreach excel file row
        foreach(excelrow row in excelrowlist)
        {
            if(token.IsCancellationRequested)
                break;

            //do db entry and update UI the progress like 
            progress.Report("Processed x number of records. please wait..");    
        }  
    }

在这种情况下,您需要在btnStart_Click中创建取消令牌源.如果不清楚,你需要这样做:

CancellationTokenSource tokenSource;

    private void btnStart_Click(object sender,RoutedEventArgs e)
    {
        txt_importStatus.Text = "";
        var progress = new Progress<string>(progress_info =>
        {
            //show import progress on a textfield
            txt_importStatus.Text = progress_info + Environment.NewLine + "Please dont close this window while the system processing the excel file contents";              
        });
        // DoProcessing is run on the thread pool.
        tokenSource = new CancellationTokenSource();
        var token = tokenSource.Token;
        await Task.Run(() => DoProcessing(token,progress));
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐