2017-06-01 16 views
1

Windows Serviceを構築して、テーブルからレコードを読み込み、WCF Serviceにレコードデータを渡し、その応答を待ち、その応答に応じてデータベース内の同じレコードを更新します。 WCF Service。このプロセスはすべてのレコードに対して継続され、すべてのレコードが処理されると、n分のコードの実行をさらに延期する必要があります。 nの時間が経過した後、同じコードを呼び出してテーブルからレコードを再度読み込んで処理し、すべてのレコードが処理されたらn分の実行をやり直してください。これは無限に起こる必要があり、最も重要な点は、すべての実行が遅延実行を含むsynchronouslyを実行する必要があるということです。Threadingまたはasync/awaitまたは他の非同期プログラミング技術の使用を完全に避けたいです。Windowsサービス再帰的な無限ループで同期タスクの遅延実行

whileを検索した後、.NET Framework 4.5で、asycn/awaitキーワードを使用せずに、遅延を同期して追加することを推奨する方法としてTask.Delay()を使用することをお勧めしました。上記のコードは正常に動作しているようだ

class Program 
    { 
     static void Main(string[] args) 
     { 
      RecursiveMethod(); 
     } 

     public static void RecursiveMethod() 
     { 
      while (true) 
      { 
       DoWork(); 
       Console.WriteLine("Task delayed..."); 
       Task.Delay(3000).Wait(); 
       Console.WriteLine("Calling method again recursively..."); 
       RecursiveMethod(); 
      } 
     } 

     public static void DoWork() 
     { 
      //Do some work 
      Console.WriteLine("Work Completed."); 
     } 
    } 

が、別のWindowsサービスでSystem.Timers.Timerを実装するとき、私は2のために適切に実行した後、大きな問題に直面していました:だから私は無限ループでrecursiveメソッドを持つシンプルなコンソールアプリケーションを作成しましたTimerは例外をスローせずに作業を完全に停止していたため、非常にイライラするエラーは記録されませんでした。

私はこのような状況を回避したいので、シンプルな同期コードのためにTask.Delay()を実装する最良の方法は何ですか?遅延は2時間に設定されますので、Task.Delay()がメモリからガベージコレクトまたは削除を実行したり、(例外をスローせずに)独自の処理を停止したりして、プロセス全体を再開する状況も処理したいと考えています。

+0

(いくつかの時間後に)、スタックオーバーフローが生成されます。 –

+0

@SirRufo私が習得しようとしていることの他の何か他のもの? – seadrag0n

+0

はい、再帰についてのチュートリアルを読んで、なぜここで使用すべきでないのかを確かめてください。 –

答えて

1

ただThread.Sleep(3000)を使用してください。なぜあなたはそれを避けたいのか分かりません。あなたのコードは同期しているので、Taskを使用しないでください。

また、Task.Delayはタイマーを使用します。それがあなたの問題を解決するかどうかは分かりません。

私は、Timerオブジェクトが動作を停止した理由を理解しようとします。それは正しいとは言えません。

タイマーコールバックはtry catchでラップされましたか?あなたのコードが非同期ではありませんので、他の人が指摘したように

+0

はい、それはtry catchでラップされていて、すべてのエラーがデータベースに記録されています。私が達成しようとしていることのためのスリープ() '? – seadrag0n

0

Task.Delayは、ここでは適切ではありません。また、あなたはすでに無限ループ(while (true))を持っているので、再帰のための必要はありません。

class Program 
{ 
    static void Main(string[] args) 
    { 
    while (true) 
    { 
     DoWork(); 
     Console.WriteLine("Task delayed..."); 
     Task.Sleep(3000); 
    } 
    } 

    public static void DoWork() 
    { 
    //Do some work 
    Console.WriteLine("Work Completed."); 
    } 
}