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

标签 c# wpf multithreading dispatcher

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

相关文章:

c# - 找不到 ObjectDataSource 的 TypeName 属性中指定的类型

c# - WPF/C#网络浏览器youtube

c# - 以XML存储实体,使用MVVM在WPF应用程序中进行读写

java - 通过线程构造函数按引用分配的列表变量不起作用

.net - 什么是背景,前景和主线程?

c# - 在 C# 中使用 bool 字段映射的 Tinyint

c# - url Unicode 字符编码

C# 列表按两列排序

c# - WPF:在工具箱中看不到我的自定义控件

multithreading - 乔布斯共享 EntityManagers - 玩!框架