.NET 6静态类如何通过Community Toolkit Messenger接收消息
静态类使用WeakReferenceMessenger接收消息的正确方式
静态类可以接收WeakReferenceMessenger的消息,你之前的问题是误用了注册重载方法,导致回调无法触发。以下是正确的实现方式:
核心思路
WeakReferenceMessenger提供了不需要接收者实例的注册重载,静态类可以利用这类重载完成消息订阅,关键是确保回调为静态逻辑,不依赖实例引用。
方式一:静态构造函数中注册(自动完成订阅)
// 自定义消息类 public class MyStatusMessage { public string NewStat { get; set; } } // 静态消息接收类 public static class StaticStatusReceiver { // 静态构造函数确保注册只执行一次 static StaticStatusReceiver() { // 注册指定类型的消息,使用static lambda避免捕获实例 WeakReferenceMessenger.Default.Register<MyStatusMessage>(static (_, message) => { HandleStatusUpdate(message.NewStat); }); } private static void HandleStatusUpdate(string newStat) { // 这里写你的消息处理逻辑 Console.WriteLine($"静态类收到状态更新:{newStat}"); } }
方式二:手动触发注册(灵活控制订阅时机)
如果不需要在类加载时就注册,可以提供静态方法手动完成订阅:
public static class StaticStatusReceiver { private static RegistrationToken _registrationToken; public static void SubscribeToStatusUpdates() { // 传递null作为接收者实例,使用静态回调 _registrationToken = WeakReferenceMessenger.Default.Register<MyStatusMessage>(null, static (_, message) => { HandleStatusUpdate(message.NewStat); }); } public static void UnsubscribeFromStatusUpdates() { // 取消注册,避免内存泄漏 WeakReferenceMessenger.Default.Unregister(_registrationToken); } private static void HandleStatusUpdate(string newStat) { // 消息处理逻辑 } }
注意事项
- 回调必须是静态逻辑(用
static修饰lambda或直接调用静态方法),不能捕获任何实例引用,否则会导致注册失效或内存泄漏。 - 如果需要取消订阅,务必保存注册时返回的
RegistrationToken,通过它完成注销操作。
内容的提问来源于stack exchange,提问作者ClarkG
相关产品推荐
相关产品推荐

