通常的做法是在 UI 线程中显示进度窗口(带有进度条)并从工作线程更新进度。
我有很多长时间的操作,它们在 GUI 线程本身中启动和运行(暂时冻结 GUI)。要求是显示所有现有长操作的进度条。通常的解决方案是将长操作作为线程移动并从那里更新进度。但我不确定这些长操作的线程安全性。
有没有办法让我们在另一个线程中显示进度窗口(所以它不会冻结),然后从主 GUI 线程本身更新进度?
通常的做法是在 UI 线程中显示进度窗口(带有进度条)并从工作线程更新进度。
我有很多长时间的操作,它们在 GUI 线程本身中启动和运行(暂时冻结 GUI)。要求是显示所有现有长操作的进度条。通常的解决方案是将长操作作为线程移动并从那里更新进度。但我不确定这些长操作的线程安全性。
有没有办法让我们在另一个线程中显示进度窗口(所以它不会冻结),然后从主 GUI 线程本身更新进度?
我不知道在另一个线程中显示 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);
}
但请注意,这不是解决问题的好方法。最好选择合适的设计。
检查这个线程
我认为你应该使用Application.DoEvents()