情况:单独的线程计时器调用UI线程并锁定,因为Form定时器锁定对象

时间:2011-06-19 10:09:36

标签: c# multithreading

情况如下:线程计时器(来自System.Threading.Timer)在一个区间内运行并使用一个对象来锁定并执行某些操作。 UI计时器(System.Windows.Forms.Timer)也会在表单上按间隔考虑并使用相同的对象。所以他也锁定了这个对象。

有时线程计时器会调用UIThread,如下所示:

lock (_lockobj)
{
    form.Invoke(new MethodInvoker(delegate
    {  // Do somethings on form }));
}

问题在于此调用将“休眠”,因为“_lockobj”上的相同锁定由Form计时器(也是睡眠)发生。所以会发生僵局(这就是它?)。

我认为这对我来说显然是在发生什么,但如何解决这个问题。或者这是设计失败?或者也许有可用的功能帮我解决这个问题?

问题是:当UIThread正在睡觉时,是否有可能是非UIThread调用表单?

感谢。

1 个答案:

答案 0 :(得分:3)

这显然是一个僵局。你不能在持有锁的情况下调用其他线程。

说明:

想象一下,计时器线程获得锁定,并将调用UI线程。在同一时刻,UI线程正在尝试获取锁,现在等待它被释放。所以返回第一个线程:对UI线程的调用无法完成,因为UI线程正在等待。死锁。

我的建议是:摆脱所有锁定,并将所有操作编组到UI线程中。这样你的调用显然是串行的(所有这些都发生在同一个线程中!),所以不需要锁定。