wpf 锁定调度程序

whitzsjs  于 2023-01-21  发布在  其他
关注(0)|答案(3)|浏览(159)

在多个线程通过调度程序访问同一个wpf组件的地方,是否需要锁定代码段?
示例:

void ladder_OnIndexCompleted(object sender, EventArgs args)
{
    lock (locker)
    {
        pbLadder.Dispatcher.Invoke(new Action(() => { pbLadder.Value++; }));
    }
}

pbLadder是一个进度条,可以同时从多个线程引发此事件。

bnlyeluc

bnlyeluc1#

如果您打算以同步方式封送到另一个线程,则不应该获取锁-否则,如果您试图在另一个线程(本例中为调度器线程)中获取相同的锁,则将以死锁告终。
如果pbLadder.Value只在UI线程中使用,那么你就不需要担心线程安全锁定问题--所有的操作都发生在同一个线程上,这一事实将你与许多常见的多线程问题隔离开来。“导致”使用pbLadder.Value的代码执行的原始操作发生在不同的线程上,这一事实是无关紧要的。

sirbozc5

sirbozc52#

Dispatcher上执行的所有操作都会排队,并在UI线程上按顺序执行。这意味着不会发生像增量这样的数据争用。Invoke方法本身是线程安全的,因此将操作添加到队列中也不需要任何锁定。
MSDN开始:
在与调度程序关联的线程上同步执行具有指定参数的指定委托。
以及:
操作将添加到Dispatcher的事件队列中指定的DispatcherPriority。

but5z9lq

but5z9lq3#

尽管这是一个很老的,它是在我的搜索结果的顶部,我是相当新的(4个月以来,我毕业),所以在阅读其他人的评论,我去和我的高级编码。什么其他人说的是准确的,但我觉得答案没有提供一个解决方案,只是信息。以下是我的高级编码的反馈:
“Dispatcher确实在自己的线程上运行,但如果另一个线程正在访问该调度程序要访问的对象,则在调度程序等待访问时,所有UI处理都会停止。要理想地解决此问题,您需要复制调度程序需要访问的对象,并将其传递给调度程序,那么调度程序就可以自由地编辑对象,而不必等待其他线程释放它们的锁。”
干杯!

相关问题