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?
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
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