2016-10-11 3 views
1

火災と忘れの多くの質問で提供される解決策をフォローアップします。私のシナリオでは、Forgottenイベントがトリガーされるように実行する必要があるということです。火災と忘れ(完全ではない)

私のソリューションはここSimplest way to do a fire and forget method in c# 4.0

に基づいていますが、私のテストコードです。また、期待どおりに処理される順序は保証されませんでした。

static void Main(string[] args) 
    { 
     Test(5); 
     Console.WriteLine("5 sent"); 

     Test(2); 
     Console.WriteLine("2 sent"); 

     Test(1); 
     Console.WriteLine("1 sent"); 

     Test(4); 
     Console.WriteLine("4 sent"); 

     Console.WriteLine("all sent"); 
     Console.ReadLine(); 

    } 

    private static void Test(int messageNumber) 
    { 
     Action myMethod =() => { 
      Task.Delay(messageNumber * 1000); 
      Console.WriteLine(messageNumber); 
     }; 
     Blindly.Run(myMethod); 
    } 

と私の出力

5 sent 
2 sent 
1 sent 
4 sent 
all sent 
2 
1 
5 
4 

、想像してみて、あなたは火を使用していて、ログ記録のために忘れてください。したがって、呼び出しコードをブロックするのではなく、記録されたすべてのデータを発生順に書き込む必要があります。

+1

あなたの行動をキューイングし、必要な順序でそれらを起動しないのはなぜ? – Shocked

+0

'Task.Delay(messageNumber * 1000);は待たれていないので、このシナリオでは役に立たないと思いますか?次の行 'Console.WriteLine(messageNumber);の前には遅延がありません。 –

答えて

1

私はTPLデータフローのActionBlockを使用したい(ANためhttp://blog.stephencleary.com/2012/09/introduction-to-dataflow-part-2.htmlを参照してください。イントロ)

これはNuGetパッケージなので、フレームワークのバージョン要件に合っているかどうか確認してください。

static void Main(string[] args) 
{ 
    var a = new ActionBlock<int>(async (messageNumber) => 
    { 
     await Task.Delay(messageNumber * 1000); 
     Console.WriteLine(messageNumber); 
    }); 

    a.Post(5); 
    Console.WriteLine("5 sent"); 

    a.Post(2); 
    Console.WriteLine("2 sent"); 

    a.Post(1); 
    Console.WriteLine("1 sent"); 

    a.Post(4); 
    Console.WriteLine("4 sent"); 

    Console.WriteLine("all sent"); 
    Console.ReadLine(); 
} 

それがActionBlockに掲載されているために、ファイア・アンド・フォーゲット方法で処理されます。

出力:

5 sent 
2 sent 
1 sent 
4 sent 
all sent 
5 
2 
1 
4 
0

私は次のようにしてください:

  • すべてログに記録されたイベント
  • はすぐにログに記録するイベントを書いていないためにあなたが非同期的にそれを実行しているので、(あなたがうまくいけばしているタイムスタンプを保ちますすでにそれについて心配していない);ログメッセージをキューに入れておき、Yミリ秒より古いメッセージをすべて並べ替えてログに記録する場合は、XとYは必要に応じて決まります(ログメッセージのキューではなく、必ずしもFIFOではない)。
  • いつでもアプリケーションが終了ログをフラッシュする/セットアップ)
  • 試み(あなたはそれは例外だ場合でも、それをやっていることを確認してください)
関連する問題