情况:单独的线程计时器调用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是否可能调用该表单?

谢谢。

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

这显然是一个死锁。持有锁时,您不能调用其他线程。

说明:

假设计时器线程获得锁,并将调用UI线程。与此同时,UI线程正在尝试获取锁,现在正在等待它被释放。因此,返回到第一个线程:对UI线程的调用无法完成,因为UI线程正在等待。僵局

我的建议是:取消所有锁定,并将所有操作封送到UI线程中。这样,您的调用显然是串行的(所有调用都发生在同一个线程中!),因此不需要锁定。