Spa*_*rky 8 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])));
Run Code Online (Sandbox Code Playgroud)
据我所知,当另一个线程访问除创建它之外的对象时,WPF不喜欢.然而,我认为必须有一个更好的方法,而不是让这么多的调度员调用,有人可能请至少把我推向正确的方向(如果有更好的解决方案).
干杯,Sparky
A.R*_*.R. 16
你可以从你的通话中减少冗长开始,即
Application.Current.Dispatcher.Invoke(() =>_aCollection.Add(new Model(aList[i], aSize[i])));
Run Code Online (Sandbox Code Playgroud)
我喜欢使用的另一个技巧是创建一个这样的快捷方法:
public static void UiInvoke(Action a)
{
Application.Current.Dispatcher.Invoke(a);
}
Run Code Online (Sandbox Code Playgroud)
那么你甚至可以做更少的事情,如:
UiInvoke(() =>_aCollection.Add(new Model(aList[i], aSize[i])));
Run Code Online (Sandbox Code Playgroud)
使用dispatcher.Invoke()实际上就是如何将操作返回到UI线程,这可能是首先创建这些对象(_aCollection)的地方.如果有问题的项目没有与UI线程直接交互,那么您可以在不同的线程上创建/操作它们,从而无需使用调度程序.当然,这种方法可能会变得更加复杂,具体取决于您正在做什么.
Ada*_*son 13
最简单的方法是将所有三个调用合并为一个:
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(
() =>
{
_aCollection.Add(new Model(aList[i], aSize[i]);
_Data.Add(new DataPoint<double, double>(Id, aList[i]);
_historical[0].Add(aList[i])
}));
Run Code Online (Sandbox Code Playgroud)
如果您使用.Net 4.0,我会考虑使用System.Threading.Tasks.这似乎是延续的一个主要例子.
| 归档时间: |
|
| 查看次数: |
40307 次 |
| 最近记录: |