我想在做一些工作时显示进度条,但这会挂起UI并且进度条不会更新.
我有一个一个WinForm ProgressForm ProgressBar将无限期地继续以滚动字幕的方式.
using(ProgressForm p = new ProgressForm(this))
{
//Do Some Work
}
Run Code Online (Sandbox Code Playgroud)
现在有很多方法可以解决这个问题,比如使用BeginInvoke,等待任务完成和调用EndInvoke.或使用BackgroundWorker或Threads.
我在使用EndInvoke时遇到了一些问题,尽管这不是问题.问题是哪种方法是用于处理此类情况的最佳和最简单的方法,您必须向用户显示程序正在运行而不是无响应,以及如何使用最简单的代码来处理这种情况,这样可以提高效率并赢得" t泄漏,可以更新GUI.
就像BackgroundWorker需要有多个函数,声明成员变量等一样.然后你需要保持对ProgressBar表单的引用并处理它.
编辑:BackgroundWorker不是答案,因为它可能是我没有得到进度通知,这意味着没有调用,ProgressChanged因为DoWork是对外部函数的单个调用,但我需要继续调用Application.DoEvents();进度条保持旋转.
赏金是针对此问题的最佳代码解决方案.我只需要调用Application.DoEvents()以便Marque进度条可以工作,而worker函数在Main线程中工作,并且它不会返回任何进度通知.我从不需要.NET魔术代码来自动报告进度,我只需要一个比以下更好的解决方案:
Action<String, String> exec = DoSomethingLongAndNotReturnAnyNotification;
IAsyncResult result = exec.BeginInvoke(path, parameters, null, null);
while (!result.IsCompleted)
{
Application.DoEvents();
}
exec.EndInvoke(result);
Run Code Online (Sandbox Code Playgroud)
保持进度条活着(意味着不冻结但刷新品牌)