ShowDialog,PropertyGrid和Timer问题

时间:2009-04-09 16:32:10

标签: c# winforms timer propertygrid showdialog

我有一个奇怪的错误,请告诉我你是否有任何关于其原因的线索。

我的主窗体上有一个TimerSystem.Windows.Forms.Timer),它会触发一些更新,最终也会更新主窗体UI。然后我有一个编辑器,它使用ShowDialog()方法从主窗体打开。在这个编辑器中,我有一个PropertyGridSystem.Windows.Forms.PropertyGrid)。

我无法每次都重现它,但很多时候,当我在编辑器中使用该属性网格的下拉列表时它会卡住,即OK / Cancel按钮不关闭表单,属性网格变得不可用,关闭按钮在表单标题中不起作用。

后台没有例外,如果我打破了这个过程,我会看到应用程序正在做一些与我在开头提到的更新相关的计算。

你能推荐什么?欢迎任何想法。

1 个答案:

答案 0 :(得分:1)

正在发生的事情是线程计时器的Tick方法不在另一个线程上执行,因此它会锁定其他所有内容,直到完成为止。我做了一个测试winforms应用程序,它有一个计时器和2个按钮,其事件做到了这一点:

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);
}