在多个线程通过调度程序访问同一个wpf组件的地方,是否需要锁定代码段?示例:
void ladder_OnIndexCompleted(object sender, EventArgs args) { lock (locker) { pbLadder.Dispatcher.Invoke(new Action(() => { pbLadder.Value++; })); } }
pbLadder是一个进度条,可以同时从多个线程引发此事件。
pbLadder
bnlyeluc1#
如果您打算以同步方式封送到另一个线程,则不应该获取锁-否则,如果您试图在另一个线程(本例中为调度器线程)中获取相同的锁,则将以死锁告终。如果pbLadder.Value只在UI线程中使用,那么你就不需要担心线程安全锁定问题--所有的操作都发生在同一个线程上,这一事实将你与许多常见的多线程问题隔离开来。“导致”使用pbLadder.Value的代码执行的原始操作发生在不同的线程上,这一事实是无关紧要的。
pbLadder.Value
sirbozc52#
在Dispatcher上执行的所有操作都会排队,并在UI线程上按顺序执行。这意味着不会发生像增量这样的数据争用。Invoke方法本身是线程安全的,因此将操作添加到队列中也不需要任何锁定。从MSDN开始:在与调度程序关联的线程上同步执行具有指定参数的指定委托。以及:操作将添加到Dispatcher的事件队列中指定的DispatcherPriority。
Dispatcher
Invoke
but5z9lq3#
尽管这是一个很老的,它是在我的搜索结果的顶部,我是相当新的(4个月以来,我毕业),所以在阅读其他人的评论,我去和我的高级编码。什么其他人说的是准确的,但我觉得答案没有提供一个解决方案,只是信息。以下是我的高级编码的反馈:“Dispatcher确实在自己的线程上运行,但如果另一个线程正在访问该调度程序要访问的对象,则在调度程序等待访问时,所有UI处理都会停止。要理想地解决此问题,您需要复制调度程序需要访问的对象,并将其传递给调度程序,那么调度程序就可以自由地编辑对象,而不必等待其他线程释放它们的锁。”干杯!
3条答案
按热度按时间bnlyeluc1#
如果您打算以同步方式封送到另一个线程,则不应该获取锁-否则,如果您试图在另一个线程(本例中为调度器线程)中获取相同的锁,则将以死锁告终。
如果
pbLadder.Value
只在UI线程中使用,那么你就不需要担心线程安全锁定问题--所有的操作都发生在同一个线程上,这一事实将你与许多常见的多线程问题隔离开来。“导致”使用pbLadder.Value
的代码执行的原始操作发生在不同的线程上,这一事实是无关紧要的。sirbozc52#
在
Dispatcher
上执行的所有操作都会排队,并在UI线程上按顺序执行。这意味着不会发生像增量这样的数据争用。Invoke
方法本身是线程安全的,因此将操作添加到队列中也不需要任何锁定。从MSDN开始:
在与调度程序关联的线程上同步执行具有指定参数的指定委托。
以及:
操作将添加到Dispatcher的事件队列中指定的DispatcherPriority。
but5z9lq3#
尽管这是一个很老的,它是在我的搜索结果的顶部,我是相当新的(4个月以来,我毕业),所以在阅读其他人的评论,我去和我的高级编码。什么其他人说的是准确的,但我觉得答案没有提供一个解决方案,只是信息。以下是我的高级编码的反馈:
“Dispatcher确实在自己的线程上运行,但如果另一个线程正在访问该调度程序要访问的对象,则在调度程序等待访问时,所有UI处理都会停止。要理想地解决此问题,您需要复制调度程序需要访问的对象,并将其传递给调度程序,那么调度程序就可以自由地编辑对象,而不必等待其他线程释放它们的锁。”
干杯!