当前位置:  开发笔记 > 编程语言 > 正文

取消背景工作者

如何解决《取消背景工作者》经验,为你挑选了1个好方法。

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

和创建工作者的代码:

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

这里提供的解决方案对我来说似乎不起作用,因为它适用于重复操作(我想这是为后台工作者创建的).为了我的目的,我是否必须使用线程(中止和连接),因为我应该为用户提供取消长时间运行操作的可能性?

需要你的建议.

提前致谢.



1> Henk Holterm..:

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

但是你不应该使用它们Thread.Abort().它可能破坏你的过程稳定.

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

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

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有