2017-09-18 3 views
0

J'ai un objet qui analyse beaucoup de données en temps réel puis déclenche un événement lorsqu'il y a un changement dans les données. Parfois, les données en temps réel peuvent ne plus être synchronisées et, lorsqu'elles sont détectées, elles créent une nouvelle instance de l'objet pour tout synchroniser.Les événements C# ne se déclenchent pas pour les nouveaux objets

Je lance un thread de surveillance qui assure la mise à jour. Il ressemble à ceci:

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); 
    } 
} 

Et la méthode 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; 
} 

Création des nouvelles œuvres d'objet, et les événements qui sont souscrits dans les nouvelles instances de Book et _predictor le feu comme prévu. Toutefois, les gestionnaires d'événements OnBookChange, DesyncDetected et OnNewPrediction ne le font pas.

Je veux supposer que cela a quelque chose à voir avec l'abonnement au mauvais objet, mais je n'arrive pas à comprendre pourquoi. Serait-ce parce que cela se passe sur un autre fil?

Répondre

-1

L'événement personnalisé devrait être déclenché manuellement, de sorte que vous pouvez tirer OrderBookChanged, DesyncDetected, PredictionChanged événements par

_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()); 

ou tout simplement appeler les méthodes directement

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

Je ne vois pas comment cela pourrait résoudre le problème. Si '_book.OrderBookChanged' est invoqué dans l'objet' _book' et que la méthode 'OnBookChanged' est souscrite, pourquoi l'appelerais-je manuellement? Le problème ici est que lorsqu'un nouvel objet est créé pour remplacer l'ancien objet '_book', les événements s'arrêtent de tirer. – w0ffen

+0

Pourriez-vous me montrer le code qui déclenche ces événements? Vous venez de les abonner dans le code que vous fournissez, peut-être que votre problème d'arrêt de tir se situe à un autre endroit. – Renshaw