当前位置: 首页 > 编程语言 > C#

多线程WPF应用:DispatcherInvoke,更有效的方法?分享

时间:2023-04-11 03:40:18 C#

多线程WPF应用程序:DispatcherInvoke。更有效的方法?使用.NET3.5大家好,我正在为一个项目制作一个WPF应用程序,我只是在寻找有关Dispatcher和多线程的一些见解。我的程序示例:Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,newAction(()=>_aCollection.Add(newModel(aList[i],aSize[i]))));Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,newAction(()=>_Data.Add(newDataPoint(Id,aList[i]))));Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,newAction(()=>_historical[0].Add(aList[i])));据我所知,WPF不喜欢另一个线程访问对象而不是创建对象。但是,我认为一定有比打这么多调度员电话更好的方法,至少有人能把我推向正确的方向(如果有更好的解决方案的话)。干杯,Sparky您可以从减少通话中的冗长开始,即Application.Current.Dispatcher.Invoke(()=>_aCollection.Add(newModel(aList[i],aSize[i])));我喜欢使用另一个技巧是创建这样的快捷方法:publicstaticvoidUiInvoke(Actiona){Application.Current.Dispatcher.Invoke(a);然后你可以做更少的事情,比如:UiInvoke(()=>_aCollection.Add(newModel(aList[i],aSize[i])));使用dispatcher.Invoke()实际上是将操作返回到UI线程的方式,这可能是最初创建这些对象(_aCollection)的地方。如果有问题的项目不直接与UI线程交互,那么您可以在不同的线程上创建/操作,从而无需使用调度程序。当然,根据您正在做的事情,这种方法可能会变得更加复杂。最简单的方法是将所有三个调用合并为一个:Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,newAction(()=>{_aCollection.Add(newModel(aList[i],aSize[i]));_Data.Add(newDataPoint(Id,aList[i]);_historical[0].Add(aList[i])}));如果你使用.Net4.0,我会考虑使用System.Threading.Tasks。这似乎成为延续的主要例子。您的问题源于ObservableCollection不会自动将更改分派到UI线程这一事实。这与简单的INotifyPropertyChanged不同,它会自动执行。我建议创建您自己的特定ObservableCollection,它实现INotifyCollectionChanged,自动将更改分派到UI线程。您可以在此处查看示例:SynchronizedObservableCollection和BindableCollection旧答案/问题:您是否使用DependencyObject和DependencyProperties进行绑定?如果是,则放弃它。它已被讨论过很多次,它是使用INotifyPropertyChanged的??更重要的原因之一。您只需要使用调度程序来修改GUI对象本身的属性,从您的示例来看,这似乎不是您正在做的。并且绑定本身通过调度程序自动运行。另请参阅视图模型:POCO和DependencyObjects以上是C#学习教程:多线程WPF应用程序:DispatcherInvoke。更有效的方法?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: