我正在使用 .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/