从UI线程同步对资源的访问

时间:2013-10-30 14:47:22

标签: c# synchronization locking ui-thread

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

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

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

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

上述内容总是在尝试获取lock时无限期挂起。我的其余代码一直运行正常,所以我认为我没有真正的竞争条件 - 我假设这种情况正在发生,因为它在UI线程上运行并且在UI线程上阻止它是一个坏主意?我错了。

但是,如果是这种情况,我猜我需要将上面的代码包装在一个方法中并以某种方式在

线程上从 UI线程调用它?

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

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