1

我有一个奇怪的错误,请让我知道您是否有任何关于原因的线索。

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

我无法每次都重现它,但是通常,当我在编辑器中使用该属性网格上的下拉菜单时,它会卡住,即确定/取消按钮不会关闭表单,属性网格变得不可用,表单中的关闭按钮标题不起作用。

后台没有例外,如果我中断该过程,我会看到该应用程序正在执行与我在开头提到的更新相关的一些计算。

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

4

1 回答 1

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);
}
于 2009-04-09T17:50:01.223 回答