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.

Foi útil?

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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top