好的,所以我在周末发现了一些奇怪的东西。我有一个 WPF 应用程序,它产生一些线程来执行后台工作。然后这些后台线程将工作项发布到我的同步上下文中。除了一种情况外,这一切都很好。当我的线程完成时,有时他们会在调度程序上发布一个操作,这将打开一个弹出窗口。最终发生的是,如果 2 个线程都在 Dispatcher 上发布一个动作,它开始处理一个,然后如果我用 Window.ShowDialog(); 打开一个弹出窗口;当前执行路径暂停等待对话框的反馈。但是问题出现了,当对话框打开时,Dispatcher 然后开始并立即开始运行已发布的第二个操作。这导致两个代码路径被执行。
我已经发布了一些示例代码来演示我正在谈论的行为。应该发生的是,如果我发布了 2 个操作并且第一个操作打开了一个对话框,那么在第一个操作完成之前,第二个操作不应该运行。
public partial class Window1 : Window {
private SynchronizationContext syncContext;
public Window1() {
InitializeComponent();
syncContext = SynchronizationContext.Current;
}
private void Button_ClickWithout(object sender, RoutedEventArgs e) {
// Post an action on the thread pool with the syncContext
ThreadPool.QueueUserWorkItem(BackgroundCallback, syncContext);
}
private void BackgroundCallback(object data) {
var currentContext = data as SynchronizationContext;
System.Console.WriteLine("{1}: Thread {0} started", Thread.CurrentThread.ManagedThreadId, currentContext);
// Simulate work being done
Thread.Sleep(3000);
currentContext.Post(UICallback, currentContext);
System.Console.WriteLine("{1}: Thread {0} finished", Thread.CurrentThread.ManagedThreadId, currentContext);
}
private void UICallback(object data) {
System.Console.WriteLine("{1}: UI Callback started on thread {0}", Thread.CurrentThread.ManagedThreadId, data);
var popup = new Popup();
var result = popup.ShowDialog();
System.Console.WriteLine("{1}: UI Callback finished on thread {0}", Thread.CurrentThread.ManagedThreadId, data);
}
}
XAML 只是一个带有调用 Button_ClickWithout OnClick 的按钮的窗口。如果您按下按钮两次并等待 3 秒,您将看到 2 个对话框一个接一个地弹出,其中预期的行为将是第一个弹出,然后一旦关闭,第二个将弹出。
所以我的问题是:这是一个错误吗?或者我该如何缓解这种情况,以便在第一个操作使用 Window.ShowDialog() 停止执行时,我只能处理一个操作?
谢谢,劳尔