Хорошо, я нашел что-то странное за выходные. У меня есть приложение WPF, которое порождает некоторые потоки для выполнения фоновой работы. Затем эти фоновые темы публикуют рабочие элементы в моем контексте синхронизации. Это все работает нормально, за исключением одного случая. Когда мои потоки заканчиваются, иногда они отправляют действия в диспетчер, который открывает всплывающее окно. В итоге происходит то, что если два потока публикуют действие в Dispatcher, оно начинает обрабатывать одно, а затем я открываю всплывающее окно с помощью Window.ShowDialog (); текущий путь выполнения приостанавливает ожидание обратной связи из диалогового окна, как и должно быть. Но проблема возникает в том, что когда диалоговое окно открывается, диспетчер затем запускается и запускается, сразу же запускается второе опубликованное действие. Это приводит к выполнению двух путей кода. Первый с открытым окном сообщения, а второй - с открытым, потому что состояние моего приложения неизвестно, потому что первое действие не было выполнено.
Я опубликовал пример кода, чтобы продемонстрировать поведение, о котором я говорю. Что должно произойти, так это то, что если я опубликую 2 действия и первое откроет диалоговое окно, второе действие не должно выполняться до тех пор, пока не будет выполнено 1-е действие.
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 секунды, вы увидите, что два диалоговых окна всплывают один над другим, где первое всплывающее окно будет с ожидаемым поведением, а после его закрытия появится второе. *
Итак, мой вопрос: это ошибка? или как мне смягчить это, чтобы можно было обрабатывать только одно действие в то время, когда первое действие останавливает выполнение с помощью Window.ShowDialog ()?
Спасибо,
Raul