我有一个奇怪的错误,请告诉我你是否有任何关于其原因的线索。
我的主窗体上有一个Timer
(System.Windows.Forms.Timer
),它会触发一些更新,最终也会更新主窗体UI。然后我有一个编辑器,它使用ShowDialog()
方法从主窗体打开。在这个编辑器中,我有一个PropertyGrid
(System.Windows.Forms.PropertyGrid
)。
我无法每次都重现它,但很多时候,当我在编辑器中使用该属性网格的下拉列表时它会卡住,即OK / Cancel按钮不关闭表单,属性网格变得不可用,关闭按钮在表单标题中不起作用。
后台没有例外,如果我打破了这个过程,我会看到应用程序正在做一些与我在开头提到的更新相关的计算。
你能推荐什么?欢迎任何想法。
答案 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);
}