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

在我的ViewModel中使用Dispatcher是不是错了?分享

时间:2023-04-11 02:38:53 C#

我的ViewModel中使用Dispatcher是不是错了?我正在将我用c#winforms编写的游戏的聊天解析器转换为wpf,主要是为了更好地处理MVVM和wpf。这是我如何设置项目视图的故事:现在它只是一个简单的列表框,其中ItemSource绑定到我的视图模型可观察的聊天集合模型:我有多个角色可以一次登录,每个角色都有一个聊天类。Chat类从游戏中启动一个后台工作人员来抓取并与下一行聊天,然后使用该行来触发一个名为IncomingChat的事件。公共事件ActionIncomingChat;我正在使用后台工作人员在我的后台工作人员progresschaged事件上触发事件,因为我在使用计时器时一直遇到线程问题。起初我通过将Timer更改为DispatchTimer来纠正此问题,但在我的模型中使用DispatchTimer似乎不合适。ViewModel:因为我有多个角色,所以我创建了多个ChatViewModel。我将一个字符传递给ChatViewModels构造函数并订阅Chat事件。我创建了一个ObservableColleciton来在收到此事件时保留我的聊天行。现在,当我尝试将从聊天事件接收到的行添加到我的observablecollection时,我在viewModel上遇到了线程问题。我通过使我的视图模型传入聊天事件处理程序看起来像这个publicObservableCollectionChat.Add(line));请注意,这与原来的略有不同,因为它不再阻塞(这更像是使用BeginInvoke而不是Invoke)。如果您需要在UI处理完消息之前阻止它,您可以使用:voidChat_Incoming(Game.ChatLineline){uiFactory.StartNew(()=>Chat.Add(line)).Wait();视图模型是传入线程同步的好地方。从模型中移除DispatcherTimer并让VM处理它。我喜欢Reed的回答,并且同意您对使用Dispatcher是错误的担忧。您的VM有对App的引用,在我看来这是对UI工件(或控件)的引用。改用Application或者更好的方法是将正确的Dispatcher实例注入VM,这样您就不需要在UI线程中实例化VM。以上是C#学习教程:在我的ViewModel中使用Dispatcher是错误的吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: