Проблема с ShowDialog, PropertyGrid и таймером
-
09-09-2019 - |
Вопрос
У меня странная ошибка, пожалуйста, дайте мне знать, если у вас есть какие-либо предположения о причине.
у меня есть Timer
(System.Windows.Forms.Timer
) в моей основной форме, которая запускает некоторые обновления, которые также в конечном итоге обновляют пользовательский интерфейс основной формы.Затем у меня есть редактор, который открывается из главной формы с помощью ShowDialog()
метод.В этом редакторе у меня есть PropertyGrid
(System.Windows.Forms.PropertyGrid
).
Я не могу воспроизводить это каждый раз, но довольно часто, когда я использую раскрывающиеся списки в этой сетке свойств в редакторе, он застревает, то есть кнопки «ОК/Отмена» не закрывают форму, сетка свойств становится непригодной для использования, кнопка «Закрыть» в форме заголовок не работает.
В фоновом режиме исключений нет, и если я прерву процесс, то увижу, что приложение выполняет некоторые вычисления, связанные с обновлениями, о которых я упоминал вначале.
Что вы можете порекомендовать?Любые идеи приветствуются.
Решение
Происходит следующее: метод Tick таймера потока не выполняется в другом потоке, поэтому он блокирует все остальное, пока оно не будет выполнено.Я создал тестовое приложение winforms, в котором был таймер и две кнопки, события которых делали следующее:
private void timer1_Tick(object sender, EventArgs e)
{
Thread.Sleep(6000);
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Start();
}
private void button2_Click(object sender, EventArgs e)
{
frmShow show = new frmShow();
show.ShowDialog(); // frmShow just has some controls on it to fiddle with
}
и действительно он заблокировался, как вы описали.Следующее решило это:
private void timer1_Tick(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(DoStuff);
}
private void DoStuff(object something)
{
Thread.Sleep(6000);
}