2012-05-02 19 views
0

我有一个相当长的运行过程,现在冻结了我的应用程序一段时间。使用backgroundworker来显示长时间运行的进程仍在工作

如何将此过程包装在背景工作器中并为用户提供状态。

我知道,理想情况下,流程本身将不得不报告其进展,但我不认为我可以构建它。并不是我无法在该流程中更改代码,但我不想更改太多。

如果我可以在后台工作中启动此过程,以便我的应用保持响应,我会很高兴。现在,我可以做到。但问题是,是否有简单的方法让一些进度条做某件事来表明进程仍在运行?

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

我的代码是现在这个样子以上,我想知道如何包装过程中以某种方式,我可以更新进度条?或者是否有一种简单的方法可以在不完全更改代码的情况下从此过程获取更多信息?在长时间运行的进程中,有一个修改的行计数器正在运行,但它只在结束时返回一个值。

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

+2

你看着BackgroundWorker的,它需要用它来更新进度条什么的ProgressChanged事件?这根本不是那么糟糕。 – Servy

+0

你用1和100之间的数字(已完成的百分比)调用它 - 这里有一个例子:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx –

+1

Henk看到我的问题,我真的没有数据..这是整个问题。 – Tys

回答

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

你可以找到完整的例子here

1

一旦你开始工作,主UI线程然后可以自由地做任何事情。所有你需要做的就是开始显示你想要的任何动画,通过定时器更新或者你想要的任何其他机制。只要确保在工作完成时停止/隐藏动画。

相关问题