Tag: 消息传递

如何异步处理消息,在处理时丢弃任何新消息?

我有一个C#应用程序订阅我们的消息传递系统上的主题以进行价值更新。 当一个新值出现时,我会进行一些处理,然后继续。 问题是,更新可以比应用程序处理它们更快。 我想要做的就是坚持最新的价值,所以我不想要一个队列。 例如,源发布值“1”,我的应用程序接收它; 在处理时,源在我的应用程序完成处理之前发布序列(2,3,4,5); 我的应用程序然后处理值“5”,抛弃先前的值。 由于它是基于专有的消息传递库,所以很难发布一个有效的代码示例,但我认为这是一个常见的模式,我只是无法弄清楚它的名称是什么……似乎处理函数必须运行在一个单独的线程上,而不是消息回调,但我不知道如何组织它,例如如何通知该线程的值更改。 关于我需要做什么的一般提示?

如何在ShowDialog()阻塞调用之前注册消息处理程序?

我正在使用Messenger类来在视图模型之间发送数据。 有一个AppView在内容控件中托管两个主视图,到目前为止,以这种方式发送/接收数据没有任何问题。 问题: 现在我添加了一个ProductView ,它显示了一个单独的AppView对话框。 但是当我调用Messenger.Default.Send(SelectedProduct); 在调用.ShowDetailDialog()之后,这会阻止Send代码调用,直到对话框关闭。 我试着反过来,首先调用Send代码,然后打开对话框。 但这意味着接收VM中的消息处理程序在发送消息之前不会及时注册。 有没有人知道一个解决方案,以防止对话框阻止发送呼叫? 或者在发送消息和显示对话框之前注册ProductVM消息处理程序? 以下是相关课程的摘要: CustomerOrdersVM(发送代码): private void EditOrder(object obj) { _dialogService.ShowDetailDialog(); Messenger.Default.Send(SelectedProduct); } ProductVM(接收代码): public ProductViewModel() { Messenger.Default.Register(this, OnSelectedProductReceived); } DialogService: class DialogService : IDialogService { Window productView = null; public DialogService() { } public void ShowDetailDialog() { productView = new ProductView(); productView.ShowDialog(); } } AppVM(主VM已注册,ProductVM独立于此VM): public […]

如何在c#中通过本地网络进行UDP组播?

我试图在我的本地网络上进行一些简单的UDP通信。 我想要做的就是对网络上的所有机器进行多播 这是我的发送代码 public void SendMessage(string message) { var data = Encoding.Default.GetBytes(message); using (var udpClient = new UdpClient(AddressFamily.InterNetwork)) { var address = IPAddress.Parse(“224.100.0.1”); var ipEndPoint = new IPEndPoint(address, 8088); udpClient.JoinMulticastGroup(address); udpClient.Send(data, data.Length, ipEndPoint); udpClient.Close(); } } 这是我的接收代码 public void Start() { udpClient = new UdpClient(8088); udpClient.JoinMulticastGroup(IPAddress.Parse(“224.100.0.1”), 50); receiveThread = new Thread(Receive); receiveThread.Start(); } public void […]

Application.DoEvents()的替代方案

我正在开发一个基于webBrowser控件的消息传递系统,这样我就可以格式化文本了。 当用户离线并发送消息时,将存储消息并在重新登录时为每条消息发送事件。当我为网站设置默认html等时,我通常使用: while (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents(); 这在程序正常运行时有效。 当用户正在接收他们离线时发送的消息时,这会触发下一个消息事件,依此类推,每个消息都会触发,直到最后一个消息。 这意味着它们脱机时发送的最后一条消息是唯一显示的消息。 我想像Application.DoEvents()这样的东西允许控件不断更新和加载,但这不会触发其他事件。 谢谢 编辑: 我通过完全删除DoEvents()来解决问题。 我没有像我工作那样更改DocumentText,而是设置了一个字符串构建器,然后在最后设置html all。

TPL Dataflow,如何将项目转发到许多链接目标块中的一个特定目标块?

我正在寻找一个TPL数据流块解决方案,它可以容纳多个项目,它可以链接到多个目标块,但是它能够将项目转发到仅通过filter/谓词的特定目标块。 任何时候都不应该将项目同时传递给多个目标块,始终只能与匹配filter的项目一起传递,否则该项目可以被丢弃。 我不喜欢BroadCastBlock,因为如果我理解正确,它不能保证传送(或者是吗?)并且过滤是在目标块侧完成的,这意味着BroadCastBlock基本上将每个项目的副本发送到所有linkedTo目标块。 如果我理解正确的话,它也不会在任何时候持有多个项目。 我不想使用Post / Async但维护LinkTo链。 是否有办法绕过完整的自定义数据流块? 或者我误解了BroadCastBlock的工作原理? 不幸的是,实际上没有太多文档可以详细介绍并涵盖用例。 任何想法都受到高度赞赏。