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

单例类内订阅EventHandler事件无响应,求问题排查方案

单例类中订阅事件无响应的问题排查

问题场景

尝试在Singleton单例类中订阅AppSettings单例的事件,但触发OnUpdated事件时无任何反应,OnAppSettingsUpdated方法未成功执行。使用方式为Singleton instance = Singleton.Instance;,且必须在Singleton类内完成订阅。相关代码如下:

Singleton类代码

public class Singleton : IDisposable
{
    private static readonly Singleton _instance = new Singleton();
    public static Singleton Instance => _instance;

    static Singleton()
    {
        AppSettings.Instance.OnUpdated += OnAppSettingsUpdated;
        OnAppSettingsUpdated(null, null);
    }
    public void Dispose()
    {
        AppSettings.Instance.OnUpdated -= OnAppSettingsUpdated;
    }

    private static void OnAppSettingsUpdated(object sender, EventArgs e)
    {
    // do something
    }
}

AppSettings类代码

public partial class AppSettings
{
    public EventHandler OnUpdated;
}

问题原因及修复方案

1. 核心问题:公共事件字段被覆盖

AppSettings中的OnUpdated是公共字段而非标准事件。外部代码若直接对其赋值(比如AppSettings.Instance.OnUpdated = new EventHandler(OtherMethod);),会直接覆盖之前通过+=添加的所有订阅,导致你的OnAppSettingsUpdated方法被移除。

2. 修复步骤

第一步:将AppSettings的字段改为标准事件

使用event关键字声明事件,限制外部只能通过+=/-=操作订阅/取消,禁止直接赋值覆盖:

public partial class AppSettings
{
    public event EventHandler OnUpdated;

    // 封装事件触发逻辑(确保线程安全)
    protected virtual void RaiseOnUpdated()
    {
        OnUpdated?.Invoke(this, EventArgs.Empty);
    }
}

第二步:确认静态构造函数执行时机

C#静态构造函数仅在首次访问类的静态成员或创建实例时执行。你调用Singleton.Instance会触发它,但可以添加调试输出验证:

static Singleton()
{
    Console.WriteLine("Singleton静态构造函数已执行");
    AppSettings.Instance.OnUpdated += OnAppSettingsUpdated;
    OnAppSettingsUpdated(null, null);
}

第三步:检查事件触发逻辑

确保AppSettings中触发事件时,是调用RaiseOnUpdated()(或直接OnUpdated?.Invoke(...)),而非错误地重新赋值OnUpdated字段。

额外注意点

  • 单例的Dispose方法:若单例为全局生命周期,该方法可能永远不会被调用,导致取消订阅逻辑无效。可在应用退出时手动调用Singleton.Instance.Dispose()。
  • 线程安全:多线程环境下,需确保事件订阅、触发及单例访问的线程安全性。

内容的提问来源于stack exchange,提问作者Gor Asatryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:15:50