是否有必要锁定多个线程通过调度程序访问相同wpf组件的代码段?
示例:
void ladder_OnIndexCompleted(object sender, EventArgs args)
{
lock (locker)
{
pbLadder.Dispatcher.Invoke(new Action(() => { pbLadder.Value++; }));
}
}
pbLadder
是一个进度条,可以在同一时间从多个线程引发此事件。
答案 0 :(得分:2)
如果您以同步方式编组到另一个线程,则不获取锁定 - 否则,如果您尝试在另一个线程中获取相同的锁定(调度程序)在这种情况下的线程)你最终会陷入僵局。
如果仅在UI线程中使用pbLadder.Value
,那么您不必担心锁定线程安全 - 所有操作都发生在同一个线程上的事实将您与大量的线程隔离开来正常的多线程问题。使用pbLadder.Value
执行导致代码的原始操作发生在另一个线程上的事实无关紧要。
答案 1 :(得分:2)
在Dispatcher
上执行的所有操作都排队并在UI线程上按顺序执行。这意味着不会发生类似增量的数据竞争。 Invoke
方法本身是线程安全的,因此将操作添加到队列也不需要任何锁定。
来自MSDN:
使用指定的参数执行指定的委托 在Dispatcher与之关联的线程上同步。
和
该操作被添加到Dispatcher的事件队列中 指定DispatcherPriority。