0

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

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

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

4

2 回答 2

1

我不知道在另一个线程中显示 ProgressBar 的解决方案,但是您可以尝试一种 hack,让系统从您的长时间运行的操作中执行其操作(更新 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);
}

但请注意,这不是解决问题的好方法。最好选择合适的设计。

于 2012-09-12T07:11:58.723 回答
1

检查这个线程

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

于 2012-09-12T07:17:48.067 回答