显示进度条:相反方向

问题描述:

通常的做法是在UI线程中显示进度窗口(带有进度条),并从工作线程更新进度。显示进度条:相反方向

我有很多在GUI线程本身启动并运行的长操作(它临时冻结GUI)。要求是显示所有现有长操作的进度条。通常的解决方案是将长操作作为线程移动,并从那里更新进度。但我不确定这些长期操作的线程安全性。

有没有一种方法,我们在另一个线程(所以它不冻结)显示进度窗口,然后从主GUI线程本身更新进度?

+0

我建议,这将是从长远来看,更好地为您重构你的长期运行的代码出来的UI和进入单独的类可以在不同的线程上运行。它会为您节省很多的痛苦,并帮助您在将来编写更好的代码。 – Enigmativity

+0

我也希望这样做。但是,这些操作是由过去的其他人撰写的,涉及文件,数据库,UI控件和每个敏感的非线程安全事物。时间和精力不利于打扰现状。 – Socrates

+0

我会倾向于不同,但我相信你会对复杂性有比我更好的想法。我认为,尽管如此,你在糟糕的情况下抛开了良好的开发人员时间,并使情况变得更糟。学习重构复杂的系统是一项你擅长练习的技巧。 – Enigmativity

我不知道解决方案在另一个线程中显示ProgressBar,但您可以试着让系统从您的长时间运行操作中执行其操作(更新UI)。对于这一点,你可以从你的长期运行的操作中反复调用下面的函数:

public static void DoEvents() { 
    DispatcherFrame frame = new DispatcherFrame(); 
    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(delegate(object parameter) { 
    frame.Continue = false; 
    return null; 
}), null); 
    Dispatcher.PushFrame(frame); 
} 

,但照顾,这不是解决问题的好办法。最好选择一个合适的设计。

入住这thread

我认为你应该使用Application.DoEvents()

+0

这是winforms。 OP已经标记了它的问题,因为WPF和WPF没有Application.DoEvents。这就是我发布替代功能的原因。但如上所述:这只是一个解决方法。 – HCL

+0

“Application.DoEvents()”的使用是非常糟糕的做法,可能会导致诸如重新入侵等各种问题。 – Enigmativity

+0

mmhmm所以我们应该怎么做,如果我们想在线程的UI中移动进度条?顺便说一句,我道歉我的答案,我认为这是一个winform :) – spajce