我想在执行某些工作时显示进度条,但这会挂起用户界面并且进度条不会更新。
我有一个带有ProgressBar
的WinForm ProgressForm,它将以跑马灯的方式无限期地继续。
using(ProgressForm p = new ProgressForm(this))
{
//Do Some Work
}
现在有许多解决问题的方法,比如使用BeginInvoke
,等待任务完成并调用EndInvoke
。或者使用BackgroundWorker
或Threads
。虽然我在使用EndInvoke时遇到了一些问题,但这不是我的问题。问题是在处理这种情况时,您使用的最佳和最简单的方法是什么,即当您必须向用户显示程序正在工作且未响应时,如何使用最简单的代码来处理它,以及如何更新GUI,而不会泄漏任何信息,并且高效率。
例如,
BackgroundWorker
需要有多个函数、声明成员变量等。此外,您需要保留对ProgressBar表单的引用并将其处理掉。
编辑:BackgroundWorker
不是答案,因为可能无法得到进度通知,这意味着没有调用ProgressChanged
,因为DoWork
只调用一个外部函数,但我需要继续调用Application.DoEvents();
以使进度条继续旋转。赏金是为了找到解决此问题的最佳代码解决方案。我只需要调用
Application.DoEvents()
,以便Marque进度条可以工作,而工作函数在主线程中工作,并且它不返回任何进度通知。我从来没有需要.NET魔法代码自动报告进度,我只需要比以下更好的解决方案:Action<String, String> exec = DoSomethingLongAndNotReturnAnyNotification;
IAsyncResult result = exec.BeginInvoke(path, parameters, null, null);
while (!result.IsCompleted)
{
Application.DoEvents();
}
exec.EndInvoke(result);
保持进度条活动状态(即不冻结但可以刷新滚动条)