我lock
在全局对象上,以便从各种线程同步到外部设备的通信,这是正常的。
我想用一个slider
控件来设置我随后发送到外部设备的值,所以我使用它的Scroll
事件来监听更改,然后再将它们发送到设备。
问题是,在与设备通信之前,我需要在全局对象上lock
,如下所示:
private void slider_Scroll(object sender, EventArgs e)
{
lock(lockObject)
{
//send slider values to external device
}
}
上述内容总是在尝试获取lock
时无限期挂起。我的其余代码一直运行正常,所以我认为我没有真正的竞争条件 - 我假设这种情况正在发生,因为它在UI线程上运行并且在UI线程上阻止它是一个坏主意?我错了。
但是,如果是这种情况,我猜我需要将上面的代码包装在一个方法中并以某种方式在
我怎样才能做到这一点?
答案 0 :(得分:1)
从主UI线程中使用lock
绝对不是一个好主意。将BackgroundWorker()控件添加到窗体并将滑块值传递给RunWorkerAsync()方法。您可以通过e.Argument
在DoWork()处理程序中检索值,并从那里安全地使用lock
。