C# 事件不会为新对象触发

Posted

技术标签:

【中文标题】C# 事件不会为新对象触发【英文标题】:C# events not firing for new objects 【发布时间】:2017-09-18 00:28:52 【问题描述】:

我有一个对象可以解析大量实时数据,然后在数据发生变化时触发一个事件。有时,实时数据可能会不同步,当检测到这种情况时,它会创建一个新的对象实例来同步所有内容。

我运行一个监控线程来确保更新正在通过。它看起来像这样:

private async Task DesyncMonitorThread()

    while (true)
    
        if ((DateTime.Now - _lastOrderBookChange) > TimeSpan.FromSeconds(30))
        
            Console.WriteLine("No order book activity in 30 seconds. Dispatching desync handler.");
            _lastOrderBookChange = DateTime.Now;
            OnDesyncDetected(this, new EventArgs());
        
        await Task.Delay(1000);
    

还有 OnDesyncDetected 方法:

private void OnDesyncDetected(object sender, EventArgs e)

    //Unsubscribe
    Console.WriteLine("Desync detected. Resyncing order book and prediction engine.");
    if (_book != null)
    
        _book.OrderBookChanged -= OnBookChange;
        _book.DesyncDetected -= OnDesyncDetected;
    

    if (_predictor != null)
        _predictor.PredictionChanged -= OnNewPrediction;

    _book = new RealtimeOrderBook(_productId);
    _predictor = new MarketPredictor(_book, Settings.PredictorSettings);

    _book.OrderBookChanged += OnBookChange;
    _book.DesyncDetected += OnDesyncDetected;
    _predictor.PredictionChanged += OnNewPrediction;

创建新对象有效,Book_predictor 的新实例中订阅的事件按预期触发。但是,事件处理程序 OnBookChangeDesyncDetectedOnNewPrediction 没有。

我想假设这与订阅错误的对象有关,但我不知道为什么。可能是因为这发生在另一个线程上?

【问题讨论】:

【参考方案1】:

自定义事件应手动触发,因此您可以触发 OrderBookChanged、DesyncDetected、PredictionChanged 事件

    _book = new RealtimeOrderBook(_productId);
    _predictor = new MarketPredictor(_book, Settings.PredictorSettings);

    _book.OrderBookChanged += OnBookChange;
    _book.DesyncDetected += OnDesyncDetected;
    _predictor.PredictionChanged += OnNewPrediction;

    _book.OrderBookChanged(_book,new EventArgs());
    _book.DesyncDetected(_book,new EventArgs());
    _predictor.PredictionChanged(_predictor,new EventArgs());

或者直接调用方法

    _book = new RealtimeOrderBook(_productId);
    _predictor = new MarketPredictor(_book, Settings.PredictorSettings);
    _book.OnBookChange(para);
    _book.OndesyncDetected(para);
    _predictor.OnNewPrediction(para);

【讨论】:

我不知道这将如何解决问题。如果在_book 对象中调用_book.OrderBookChanged 并且订阅了OnBookChanged 方法,我为什么要手动调用它?这里的问题是,当创建一个新对象来替换旧的 _book 对象时,事件会停止触发。 你能告诉我触发这些事件的代码吗?您只是在您提供的代码中订阅了它们,也许您的停止触发问题位于其他地方。

以上是关于C# 事件不会为新对象触发的主要内容,如果未能解决你的问题,请参考以下文章

使用带有滚动条的任何控件时不会触发 MouseWheel 事件(在 C# Windows 窗体中)

Windows Hooks 不会触发事件并且 Windows 开始滞后。 (在 C# 中使用 globalmousekeyhook)

C#事件学习

C# 中Panel 的 MouseHover事件有问题

C# 中所有触发事件的说明

C# winform窗体有个button按钮,我想鼠标点击它不松一直会触发一个事件?是button的哪个事件?