У меня есть несколько сложное приложение WPF, которое, кажется, «висит» или застревает в вызове Wait при попытке использовать диспетчера для вызова вызова в потоке пользовательского интерфейса.WPF Dispatcher.Invoke 'hanging'
Общий процесс:
- Обрабатывать событие щелчка на кнопке
- Создать новую тему (STA), который: создает новый экземпляр ведущего и пользовательского интерфейса, а затем вызывает метод Disconnect
- Disconnect затем устанавливает свойство на UI называется Имя
- инкубатор для имени затем использует следующий код для установки свойства:
if(this.Dispatcher.Thread != Thread.CurrentThread)
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate{
this.Name = value; // Call same setter, but on the UI thread
});
return;
}
SetValue(nameProperty, value); // I have also tried a member variable and setting the textbox.text property directly.
Моя проблема заключается в том, что когда диспетчер вызова метод называется он подвисает каждый раз, и CallStack указывает, что его во сне, ждать или присоединиться в рамках реализации Invoke.
Итак, есть ли что-то, что я делаю неправильно, что у меня отсутствует, очевидно или нет, или есть лучший способ обратиться к потоку пользовательского интерфейса, чтобы установить это свойство (и другие)?
Edit: Решение было назвать System.Windows.Threading.Dispatcher.Run() в конце нити делегата (например, когда работа выполняется) - Спасибо всем, кто помог.
@Matthew - на самом деле, нет ничего «неоптимального» о BeginInvoke; если вам не нужно обновление * сейчас *, это нормально. Вы должны быть немного осторожны с захваченными переменными, хотя (т. Е. Не меняйте «значение» после вызова BeginInvoke. На всех.) –
@Matthew - вы не присоединяетесь() к новой теме вообще, не так ли? Это объяснило бы это ... –
@Marc Gravell - из памяти я в какой-то момент входил в поток, но я не уверен, было ли поведение таким же, когда я не использовал это. Причина подключения - я хотел заблокировать остальную часть приложения, пока работа не завершится, но, возможно, я смогу использовать альтернативу. –