0
I lock
在全局对象上,以便将来自各个线程的外部设备的通信同步到工作正常。同步对UI线程的资源访问
我想要用户使用一个slider
控件来设置我发送给我的外部设备的值,因此我使用它的Scroll
事件在将它们发送到设备之前监听更改。
的问题是,我需要lock
全局对象上与设备通信之前,如下所示:
private void slider_Scroll(object sender, EventArgs e)
{
lock(lockObject)
{
//send slider values to external device
}
}
上面总是无限期地挂在试图获得lock
。我的代码的其余部分一直工作正常,所以我不认为我有一个真正的竞争条件 - 我认为这是因为它在UI线程上运行,并且它是一个糟糕的想法阻止在UI线程?我可能是错的。但是,如果是这种情况,我猜我需要在方法中包装上述代码,并以某种方式在“主”线程上调用它,从 UI线程?
我该如何做到这一点?
非常感谢您的回答。我想这可能会起作用。每次移动滑块时,在旋转BackgroundWorker时是否会有很多开销?是否有可能使用委托代替? –
如果您尝试在运行时再次运行BackgroundWorker(),则会引发异常。您可以检查其IsBusy()属性以决定是否运行它。无论采用哪种方法,等待控件停止更改并仅发送最后一个值可能更有意义。你使用的是什么控制?......“滑块”可以是几种不同的。 –
只是一个Windows窗体'滑块'。发送最后一个值很简单,谢谢。为了从我的外部设备读取值,我想我必须通过BackgroundWorker的RunWorkerCompleted事件将值返回给UI元素? –