2016-05-09 7 views
2

Thread Abort Exception in.NET 4.5によると、私はQueueBackgroundItemを使用する必要があります。待機中のバックグラウンドWorkItemの遅延

何らかの理由で、キューに入れられているバックグラウンド項目を直接開始しないでください(同じユーザーがEWSから直接取得しなければならないデータを要求したため、Exchangeサーバーはその後完全な同期を直接行うことが悪意のあるDoS EWSで試行します)、アイテムがキューイングされた後に特定のTimeSpanだけが送信されます。

だから、私は次のように作っ:Why use async with QueueBackgroundWorkItem?で説明したいくつかの理由から

public static void DoAfter(TimeSpan waitFor, Action<Logger> action) 
    { 
     HostingEnvironment.QueueBackgroundWorkItem(async ct => 
     { 
      await Task.Delay(waitFor); 
      DatabaseLogger logger = new DatabaseLogger(DebugLevel.TOSQL, db); 
      logger.Log("Executing " + action.Method.Name + ", " + DateTime.Now.ToLongTimeString()); 
      try 
      { 
       action(logger); 
       logger.Log("Successfully executed " + action.Method.Name + ", " + DateTime.Now.ToLongTimeString()); 
      } 
      catch (Exception e) 
      { 
       logger.Log("Error in " + action.Method.Name + ": " + e.Message + ", " + DateTime.Now.ToLongTimeString()); 
      } 
      finally 
      { 
       logger.CloseDatabase(); 
      } 
     }); 
    } 

、 "あなたはここでasyncを使用しないでください"。

しかし、「その代わりThread.Sleep使用Task.Delayを使用する」とし、await task.Delayセマンティックコンパイラエラーにを与えるには、「演算子を待つ非同期ラムダ式の中でのみ使用することができ、」私はBackgroundWorkItemキューを詰まらせることなくBackgroundWorkItemを遅らせるだろうか、

答えて

2

あなたの状況はあなたが投稿したあなたの質問とは異なると思います。その質問では、OPは既に非同期メソッド(例えば、Taskを返したもの)を非同期ラムダ(実際には彼の質問ではない)でラップしていました。だから、私がアドバイスを読んでいるうちに、彼がやっていたことは重複していた。そこで彼はちょうどLongRunningMethodを渡すことができた。

非同期ラムダの使用にはいくつかの落とし穴がありますが、通常はActionのために使用していますが、Actionは無効返信デリゲートであるためです。その上のいくつかのより多くの読書here

関連する問題