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
的新实例中订阅的事件按预期触发。但是,事件处理程序 OnBookChange
、DesyncDetected
和 OnNewPrediction
没有。
我想假设这与订阅错误的对象有关,但我不知道为什么。可能是因为这发生在另一个线程上?
【问题讨论】:
【参考方案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)