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()
がメモリからガベージコレクトまたは削除を実行したり、(例外をスローせずに)独自の処理を停止したりして、プロセス全体を再開する状況も処理したいと考えています。
(いくつかの時間後に)、スタックオーバーフローが生成されます。 –
@SirRufo私が習得しようとしていることの他の何か他のもの? – seadrag0n
はい、再帰についてのチュートリアルを読んで、なぜここで使用すべきでないのかを確かめてください。 –