You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:20:31