Вопрос

У меня странная ошибка, пожалуйста, дайте мне знать, если у вас есть какие-либо предположения о причине.

у меня есть 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top