0

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

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

我知道理想情况下,流程本身必须报告其进度,但我认为我无法构建它。并不是我无法更改该流程中的代码,而是我不想更改太多。

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

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

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

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

4

2 回答 2

2

如果将 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);
}

你可以在这里找到完整的例子

于 2012-05-02T21:12:32.317 回答
1

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

于 2012-05-02T20:57:14.567 回答