2017-09-18 1 views
0

多くのリアルタイムデータを解析し、データが変更されたときにイベントを発生させるオブジェクトがあります。場合によっては、リアルタイムデータの同期が外れることがあります。このデータが検出されると、オブジェクトの新しいインスタンスが作成され、すべてのバックアップが同期されます。新しいオブジェクトのC#イベントが起動しない

更新が確実に行われるよう監視スレッドを実行します。

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方法::新しいオブジェクトの動作、および意図したとおりにBook_predictor火災の新しいインスタンスにに加入しているイベントを作成

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

それはこのようになります。ただし、イベントハンドラOnBookChangeDesyncDetected、およびOnNewPredictionはありません。

これは間違ったオブジェクトを購読することと関係があると仮定したいと思いますが、理由を理解できません。これは別のスレッドで発生している可能性がありますか?あなたがOrderBookChanged、DesyncDetectedを発射できるように、カスタムイベントは、手動でトリガする必要があります

答えて

-1

_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); 
+0

をメソッドを呼び出すことにより、イベントをPredictionChanged問題を解決します。 '_book'オブジェクトで' _book.OrderBookChanged'が呼び出され、 'OnBookChanged'メソッドがそれにサブスクライブされている場合、なぜそれを手動で呼び出すのでしょうか?ここで問題となるのは、古い '_book'オブジェクトを置き換えるために新しいオブジェクトが作成されると、イベントは起動を停止するということです。 – w0ffen

+0

これらのイベントを発生させるコードを表示できますか?あなたはあなたが提供したコードでそれらを購読しました。おそらくあなたの停止発射の問題は、他の場所で見つけることができます。 – Renshaw

関連する問題