取消的BackgroundWorker [英] Cancel backgroundworker

查看:186
本文介绍了取消的BackgroundWorker的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有UI这显示长期运行的操作(从FTP下载一些文本文件)的状态。对于我的目的,我使用的BackgroundWorker,我无法取消操作。

I have UI which displaying status of long-running operations (downloading some text files from ftp) . For my purposes I use backgroundworker and I can't cancel operation.

void worker_DoWork( object sender, DoWorkEventArgs e )
    {

        try
        {
            int rowIndex = (int)e.Argument;

            //begin UI update
            StartWaitingBar(rowIndex);
            //get provider id cell
            GridViewDataRowInfo row = _proivderGridView.Rows[rowIndex];
            GridViewCellInfo provIdCell = row.Cells[ "ProviderId" ];

            var providerData = GetProviderData(Convert.ToInt32( provIdCell.Value));
            var provider =  ProviderFactory.CreateProvider(providerData);
            provider.Synchronize();
            e.Result = rowIndex;

        }
        catch (Exception exception)
        {
           return;
        }
    }

和code为职工创造:

And code for worker creation:

           BackgroundWorker worker = new BackgroundWorker();
           worker.DoWork += worker_DoWork;
           worker.RunWorkerCompleted += worker_RunWorkerCompleted;
           worker.WorkerSupportsCancellation = true;
           worker.RunWorkerAsync(args.RowIndex);
          _syncWorkers.Add(providerId,worker);
           ...
            var worker = _syncWorkers[providerId];

            if(worker.IsBusy)
             {
                 worker.CancelAsync();
             }
            else
            {
                worker.RunWorkerAsync(args.RowIndex);
            }   

提供的解决方案<一href="http://stackoverflow.com/questions/123661/net-how-to-wait-for-a-backgroundworker-to-cancel">here似乎不是为我工作怎么一回事,因为它适用于经常性操作(为其创建后台工作,我想)。我一定要使用线程(终止和联接),我的目的,因为我提供的可能性,用户取消长时间运行的操作?

Solution provided here seems not working for me beacuse it works for recurring operations (for which background worker is created, I suppose). Do I have to use threads(abort and join) for my purposes because I should provide possibilities for user to cancel long-running operation?

需要您的咨询。

在此先感谢。

推荐答案

您无法使用 Backgroundworker.CancelAsync()取消长时间运行的I / O操作。像rifnl应答,DoWork的必须检查 worker.CancellationPending ,并设置 e.Cancel

You cannot use Backgroundworker.CancelAsync() to cancel a long running I/O action. Like rifnl answered, the DoWork has to check worker.CancellationPending and set e.Cancel.

但你不应该使用 Thread.Abort的()无论是。它可能会破坏你的工艺。

But you shouldn't use Thread.Abort() either. It could destabilize your process.

您需要的解决方案必须来自 provider.Synchronize(); 不知何故

The solution you need has to come from provider.Synchronize(); somehow.

PS:和抓{返回; } 是可怕的。删除整个try / catch语句,让BGW处理异常。

PS: and catch { return; } is horrible. Remove the entire try/catch and let the Bgw handle exceptions.

这篇关于取消的BackgroundWorker的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆