使用后台工作线程来显示长时间运行的进程仍在工作

本文关键字:工作 运行 进程 长时间 显示 后台 线程 | 更新日期: 2023-09-27 18:33:02

我有一个很长的运行过程,现在冻结我的应用程序一段时间。

如何将此过程包装在后台工作线程中并为用户提供状态。

我知道,理想情况程本身必须报告其进度,但我认为我无法建立它。并不是说我不能在这个过程中更改代码,而是我不想更改太多。

如果我可以在后台工作者中启动该过程,以便我的应用程序保持响应,我会很好。现在我可以做到了。但问题是,有没有一种简单的方法可以让一些进度条做一些事情来指示进程仍在运行?

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    StartLongRunningProcess();
}

我的代码现在就像上面一样,我想知道如何以某种方式包装进程以更新进度条?或者有没有一种简单的方法可以从此过程获取更多信息,而无需完全更改其代码?在这个长时间运行的过程中,有一个修改后的行计数器正在运行,但它只在完成后返回一个值。

我知道后台工作者及其 ReportProgress 选项是如何工作的,但问题是该进程只是运行并且在运行时不提供任何反馈。

使用后台工作线程来显示长时间运行的进程仍在工作

如果将 WorkerReportsProgress 属性设置为 true,则可以使用 ProgressChanged 事件。

BackgroundWorker bw = new BackgroundWorker{WorkerReportsProgress = true}
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   var percent = e.ProgressPercentage;
   //update progress bar here
}

然后在您的工作中,您可以报告进度。

private void bw_DoWork(object sender, DoWorkEventArgs e)
{   
   BackgroundWorker worker = sender as BackgroundWorker;    
   e.Result = StartLongRunningProcess(worker);
}
public void StartLongRunningProcess(BackgroundWorker worker)
{
   worker.ReportProgress(percentComplete);
}

您可以在此处找到完整示例

启动工作线程后,主 UI 线程就可以自由地执行任何它想要的操作。 此时,您需要做的就是开始显示您想要的任何动画,通过计时器更新,或者您想要的任何其他机制。 只需确保在工人完成后停止/隐藏动画即可。