2013-10-30 26 views
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线程?

我该如何做到这一点?

回答

1

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

+0

非常感谢您的回答。我想这可能会起作用。每次移动滑块时,在旋转BackgroundWorker时是否会有很多开销?是否有可能使用委托代替? –

+0

如果您尝试在运行时再次运行BackgroundWorker(),则会引发异常。您可以检查其IsBusy()属性以决定是否运行它。无论采用哪种方法,等待控件停止更改并仅发送最后一个值可能更有意义。你使用的是什么控制?......“滑块”可以是几种不同的。 –

+0

只是一个Windows窗体'滑块'。发送最后一个值很简单,谢谢。为了从我的外部设备读取值,我想我必须通过BackgroundWorker的RunWorkerCompleted事件将值返回给UI元素? –