2016-08-13 20 views
0

特定のエンティティで発生する可能性が高いイベントの割合が高く、ネットワーク経由でイベントを転送する必要があります。問題は、これらのイベントが高いレベルのトラフィックと計算を生成し、それが望ましくないことです。メソッドコールの遅延

私の質問は、特定の時間量の計算機能の実行を遅らせる最善の方法でしょう。私の場合、イベントにはバッファリングや発生順序が必要な実際のデータはありません。基本的にイベントが発生するとタイマーを開始し、遅延が終了するとエンティティパラメータで起動します。

タイマーで独自の実装を構築できましたが、それをサポートする必要があるものが既に存在しているようです。

誰かが既存の実装やフレームワークを教えてくれれば大いに感謝します。

編集

[OK]を、私はRX観察可能なパターンを見ていると、それは仕事をすることができますように見えます。私は私がサンプルが加入者への呼び出しを遅らせるべきで

subject.OnNext(someValue); 

呼ぶだろう、私はイベントを処理したい時はいつでも私は今、例えば

IDisposable handlers; 
     Subject<int> subject = new Subject<int>(); 
     handlers = subject.AsObservable().Sample(TimeSpan.FromSeconds(10)) 
      .Subscribe(sample => 
     { 
      Trace.WriteLine(sample); 
     }); 

を使用することができ、簡単な実装を見ることができます。 私はこの使用法で正しい場合誰かがコメントできますか?ここで

+0

非常に多くのオプションがあります。 –

+0

いくつかの参考資料が良いでしょう。 – NullReference

+0

確かに、私が提供できる最良のものは、C#Cookbookの並行性です。スティーブンスは、Rx、Dataflowなどのさまざまなアプローチでいくつかの調整方法を提供していますが、私はそれを礼儀として提供しています。誰もあなたに外部リソース参照を提供することを期待するべきではありません。話題にならないようにする。 –

答えて

0

は、あなたが何ができるかを例です。

public class ExpiryDictionarty 
{ 
    Timer timer; //will hanlde the expiry 
    ConcurrentDictionary<string, string> state; //will be used to save the last event 

    public ExpiryDictionarty(int milisec) 
    { 
     state = new ConcurrentDictionary<string, string>(); 
     timer = new Timer(milisec); 
     timer.Elapsed += new ElapsedEventHandler(Elapsed_Event); 
     timer.Start(); 
    } 

    private void Elapsed_Event(object sender, ElapsedEventArgs e) 
    { 
     foreach (var key in state.Keys) 
     { 
      //fire the calculation for each event in the dictionary 
     } 
     state.Clear(); 
    } 

    public void Add(string key, string value) 
    { 
     state.AddOrUpdate(key, value); 
    } 
} 

あなたの時間はあなたがコレクション内のすべてのイベントを発生することができダニたら、あなたが受け取るすべてのイベントを保存しますコレクションを作成することができ、辞書を使用しているため、最後のイベントだけを保存できるため、取得したすべてのイベントを保存する必要はありません。

0

Proxy design patternをご覧ください。クライアントはプロキシについてのみ認識し、Proxyオブジェクトのイベントをトリガします。 Proxyオブジェクトには、実際のリクエストをいつ送信するかを決定するロジックが含まれます。このロジックは要件によって異なる場合があります。私が理解したところでは、ブールスイッチisEventRaisedを持ち、構成可能な間隔内でそれをチェックすることで、この間隔の最後にフラグをfalseにリセットすることができます。

また、調整の実装を最初にチェックして、それらの要件が要件を満たすかどうかを調べることができます。たとえば、さまざまな調整方法に関するStackOverflow questionがあります。特に、Token bucket algorithmを参照してください。