gpt4 book ai didi

c# - 多线程 WPF Application : Dispatcher Invoke. 更高效的方法?

转载 作者:太空狗 更新时间:2023-10-29 18:01:18 25 4
gpt4 key购买 nike

我正在使用 .NET 3.5。

我正在为一个项目制作一个 WPF 应用程序,我只是想了解一下有关 Dispatcher 和多线程的知识。我的程序示例:

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(
() =>_aCollection.Add(new Model(aList[i], aSize[i]))));

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(
() => _Data.Add(new DataPoint<double, double>(Id, aList[i]))));

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(
() => _historical[0].Add(aList[i])));

我知道 WPF 不喜欢另一个线程访问创建它的对象以外的对象。但是,我在想肯定有比调用这么多调度程序更好的方法,有人能至少把我推向正确的方向吗(如果有更好的解决方案的话)。

最佳答案

您可以先在通话中减少冗长,即

Application.Current.Dispatcher.Invoke(() =>_aCollection.Add(new Model(aList[i], aSize[i])));

我喜欢使用的另一个技巧是创建一个像这样的快捷方法:

public static void UiInvoke(Action a)
{
Application.Current.Dispatcher.Invoke(a);
}

那么你要做的就更少了,如:

UiInvoke(() =>_aCollection.Add(new Model(aList[i], aSize[i])));

使用 dispatcher.Invoke() 实际上就是将操作返回到 UI 线程的方式,这可能是最初创建这些对象 (_aCollection) 的地方。如果有问题的项目与 UI 线程没有直接交互,那么您可以在不同的线程上创建/操作它们,从而无需使用调度程序。当然,这种方法可能会变得更加复杂,具体取决于您在做什么。

关于c# - 多线程 WPF Application : Dispatcher Invoke. 更高效的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5464038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com