情况:单独的线程计时器调用UIThread并锁定,因为Form计时器锁定了对象
本文关键字:计时器 锁定 因为 Form 对象 UIThread 单独 线程 调用 情况 | 更新日期: 2023-09-27 17:59:39
情况如下:线程计时器(来自System.Threading.timer)在一个间隔内运行,并使用对象锁定和执行某些操作。UI计时器(System.Windows.Forms.timer)也会根据间隔和使用相同对象来思考表单。所以他也锁定了这个物体。
有时线程计时器会调用UIThread,如下所示:
lock (_lockobj)
{
form.Invoke(new MethodInvoker(delegate
{ // Do somethings on form }));
}
问题是,此调用将"睡眠",因为Form计时器(也处于睡眠状态)对"_lockobj"进行了相同的锁定。所以死锁就发生了(事实就是这样?)。
我想我很清楚这里发生了什么,但如何解决这个问题。或者这是设计上的失误?或者可能有一些功能可以帮助我?
问题是:当UIThread处于睡眠状态时,非UIThread是否可能调用该表单?
谢谢。
这显然是一个死锁。持有锁时,您不能调用其他线程。
说明:
假设计时器线程获得锁,并将调用UI线程。与此同时,UI线程正在尝试获取锁,现在正在等待它被释放。因此,返回到第一个线程:对UI线程的调用无法完成,因为UI线程正在等待。僵局
我的建议是:取消所有锁定,并将所有操作封送到UI线程中。这样,您的调用显然是串行的(所有调用都发生在同一个线程中!),因此不需要锁定。