情况如下:线程计时器(来自System.Threading.Timer)在一个区间内运行并使用一个对象来锁定并执行某些操作。 UI计时器(System.Windows.Forms.Timer)也会在表单上按间隔考虑并使用相同的对象。所以他也锁定了这个对象。
有时线程计时器会调用UIThread,如下所示:
lock (_lockobj)
{
form.Invoke(new MethodInvoker(delegate
{ // Do somethings on form }));
}
问题在于此调用将“休眠”,因为“_lockobj”上的相同锁定由Form计时器(也是睡眠)发生。所以会发生僵局(这就是它?)。
我认为这对我来说显然是在发生什么,但如何解决这个问题。或者这是设计失败?或者也许有可用的功能帮我解决这个问题?
问题是:当UIThread正在睡觉时,是否有可能是非UIThread调用表单?
感谢。
答案 0 :(得分:3)
这显然是一个僵局。你不能在持有锁的情况下调用其他线程。
说明:
想象一下,计时器线程获得锁定,并将调用UI线程。在同一时刻,UI线程正在尝试获取锁,现在等待它被释放。所以返回第一个线程:对UI线程的调用无法完成,因为UI线程正在等待。死锁。
我的建议是:摆脱所有锁定,并将所有操作编组到UI线程中。这样你的调用显然是串行的(所有这些都发生在同一个线程中!),所以不需要锁定。