如何正确实现 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++ 代码的进度?