ShowDialog, PropertyGrid e problema Temporizador
-
09-09-2019 - |
Pergunta
Eu tenho um bug estranho, por favor, deixe-me saber se você tem quaisquer pistas sobre a razão.
Eu tenho um Timer
(System.Windows.Forms.Timer
) no meu formulário principal, que dispara algumas atualizações, que também, eventualmente, atualizar o formulário principal UI. Então eu tenho um editor, que é aberto a partir do formulário principal utilizando o método ShowDialog()
. Nesta edição eu tenho um PropertyGrid
(System.Windows.Forms.PropertyGrid
).
Eu sou incapaz de reproduzi-lo toda vez, mas muito frequentemente, quando eu uso dropdowns em que grade de propriedades no editor ele fica preso, que é OK / Cancelar botões não fecham o formulário, grade de propriedade torna-se não utilizável, botão Fechar no cabeçalho do formulário não funciona.
Não há exceções no fundo, e se eu quebrar o processo vejo que o aplicativo está fazendo alguns cálculos relacionados com as atualizações que eu mencionei no início.
O que você pode recomendar? Todas as idéias são bem-vindas.
Solução
O que está acontecendo é que o método Tick do timer segmento não executar em um segmento diferente, por isso é trancar tudo o resto até que seja feito. Eu fiz um aplicativo winforms teste que tinha um temporizador e 2 botões nele cujos eventos fez isso:
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
}
E realmente bloqueado como você descreveu. O seguinte resolveu:
private void timer1_Tick(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(DoStuff);
}
private void DoStuff(object something)
{
Thread.Sleep(6000);
}