如何正确实现 BackgroundWorker 以通知用户任务正在进行中

Posted

技术标签:

【中文标题】如何正确实现 BackgroundWorker 以通知用户任务正在进行中【英文标题】:How to correctly implement BackgroundWorker to inform user that the task is progressing 【发布时间】:2019-11-06 09:37:33 【问题描述】:

问题 我使用了来自https://github.com/zaagan/BioMetrix 的项目,并希望使用 BackgroundWorker 在长时间任务中显示进度(例如:获取日志数据大约需要 30 秒)

到目前为止我做了什么 1- 从工具箱中添加了 backgroundWorker1 2- 在 InitializeComponent() 之后,我添加了:

 backgroundWorker1.WorkerReportsProgress = true;
 backgroundWorker1.WorkerSupportsCancellation = true;

3- 添加了这些功能:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    
        BackgroundWorker worker = sender as BackgroundWorker;

        for (int i = 1; i <= 10; i++)
        
            if (worker.CancellationPending == true)
            
                e.Cancel = true;
                break;
            
            else
            

                System.Threading.Thread.Sleep(500);
                worker.ReportProgress(i * 10);
            
        
    

private void backgroundWorker1_ProgressChanged(object sender, 
 ProgressChangedEventArgs e)
    
        this.Text = (e.ProgressPercentage.ToString() + "%");
    


private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    
        if (e.Cancelled == true)
        
            this.Text = "Canceled!";
        
        else if (e.Error != null)
        
            this.Text = "Error: " + e.Error.Message;
        
        else
        
            this.Text = "Done!";
        
    

我希望在从设备检索日志数据时查看主标题文本上的进度百分比。

【问题讨论】:

我不鼓励使用 BGW。请改用 Task.Run 和 IProgress 我不能说得比 Stephen C 本人更好:Task.Run vs BackgroundWorker 尤其是那个系列:Reporting Progress “我希望在主标题文本上查看进度百分比”你得到了什么? @Fildor 感谢您将我指向 Task.Run,​​顺便说一句,在操作完成之前,我没有得到预期的标题百分比 UI 被冻结 【参考方案1】:

您需要将事件处理程序分配给事件

worker.DoWork += backgroundWorker_ProgressChanged;

如果您创建了 Windows 窗体,则需要查看 Background Worker 属性的事件页面并找到 DoWork 事件,然后为其分配要运行的函数。

【讨论】:

以上是关于如何正确实现 BackgroundWorker 以通知用户任务正在进行中的主要内容,如果未能解决你的问题,请参考以下文章

C#应用BackgroundWorker组件实现异步功能

如何使用 C# BackgroundWorker 报告本机 C++ 代码的进度?

C# backgroundworker使用方法

如何在点击触发的backgroundWorker中添加一段代码?

如何同时运行两个或多个SQL查询?

如何在窗体的关闭事件中停止 BackgroundWorker?