在.NET中需用Messenger实现异步消息解耦:注册时必须传入this标识接收者,发送支持简单类型、自定义类(需public且无参构造)及泛型消息,注销须严格匹配实例、类型与方法签名,否则导致内存泄漏。

要在.NET应用中可靠地处理异步消息队列,必须借助Messenger实现跨线程、跨组件的消息解耦传递,避免直接调用引发的阻塞或UI冻结问题。
注册消息接收器
在需要响应消息的类(如ViewModel或页面)初始化时,调用Register方法绑定消息类型与处理逻辑。
使用Messenger.Default.Register
若注册时不指定接收者实例,后续调用Unregister时将无法清除对应监听器,导致内存泄漏和重复触发。
发送消息
方法一:发送简单类型消息
Messenger.Default.Send("订单已提交"); → 字符串消息会广播给所有注册了string类型的接收器。
方法二:发送自定义消息对象
var msg = new OrderSubmittedMessage { OrderId = 1001, Timestamp = DateTime.Now };
Messenger.Default.Send(msg); → 自定义类需为public且有无参构造函数,否则某些序列化场景下会失败。
方法三:发送带泛型约束的消息
Messenger.Default.Send(new NotificationMessage("操作成功", NotificationType.Success)); → 此类消息支持类型筛选,只有注册了NotificationMessage的接收器才会收到。
安全注销监听器
第一步:在接收器生命周期结束前(如ViewModel的Cleanup方法或页面OnDisappearing中)执行注销。
第二步:严格匹配注册时的参数——必须使用相同的接收器实例、相同的消息类型、相同的回调方法签名。
第三步:调用Messenger.Default.Unregister
第四步:若曾用匿名委托注册(如x => Handle(x)),则无法精确注销,必须改用命名方法。


















