c# - 取消backgroundworker

标签 c# .net multithreading

我有显示长时间运行操作状态的 UI(从 ftp 下载一些文本文件)。出于我的目的,我使用 backgroundworker 并且我无法取消操作。

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;
        }
    }

以及创建 worker 的代码:

           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);
            }   

提供解决方案here似乎对我不起作用,因为它适用于重复操作(我想是为此创建了后台工作人员)。我是否必须出于我的目的使用线程(中止和加入),因为我应该为用户提供取消长时间运行的操作的可能性?

需要您的建议。

提前致谢。

最佳答案

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

但是你也不应该使用 Thread.Abort()。它可能会破坏您的过程。

您需要的解决方案必须以某种方式来自 provider.Synchronize();

PS: 和 catch { return; 太可怕了。删除整个 try/catch 并让 Bgw 处理异常。

关于c# - 取消backgroundworker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3255459/

相关文章:

python - 在许多单独的线程中测试 Django 应用程序

c# - 控制台中的异步无效方法不想触发

c# - 你应该对简单属性进行单元测试吗?

c# - 如何确定 Entity Framework 对象是否已更改?

C# webservice 将类转换为自身

java Action 监听器: retrieve TextField in a separate thread

java - run() 方法未使用 start() 执行

c# - 进度条 C#

c# DataGridViewComboBoxColumn selectedValue 分布在整行

c# - 库需要引用 System.Windows.Forms