0

lock在一个全局对象上,以便从各种线程同步与外部设备的通信,这工作正常。

我想使用一个slider控件来设置值,然后将其发送到我的外部设备,所以我使用它的Scroll事件来监听更改,然后再将它们发送到设备。

问题是,在与设备通信之前,我需要lock在全局对象上,如下:

private void slider_Scroll(object sender, EventArgs e)
{
    lock(lockObject)
    {
        //send slider values to external device
    }
}

以上总是无限期地挂在试图获得lock. 我的其余代码工作正常,所以我认为我没有真正的竞争条件 - 我假设这是因为它在 UI 线程上运行并且在 UI 线程上阻塞是一个坏主意?我可能是错的。

但是,如果是这种情况,我猜我需要将上面的代码包装在一个方法中,并以某种方式在 UI 线程的“主”线程上调用它?

我怎样才能做到这一点?

4

1 回答 1

1

lock从主 UI 线程使用绝对不是一个好主意。将 BackgroundWorker() 控件添加到窗体并将滑块值传递给 RunWorkerAsync() 方法。您可以通过 检索 DoWork() 处理程序中的值,并从那里e.Argument安全地使用。lock

于 2013-10-30T15:06:04.927 回答