windows 为同步任务延迟执行服务递归无限循环
windows service recursive infinite loop with delayed execution for synchronous task
我正在构建一个 Windows Service
以从 table 读取记录,将记录数据传递给 WCF Service
,等待它的响应并更新数据库中的相同记录,具体取决于来自 WCF Service
的响应。此过程将针对所有记录继续进行,一旦处理完所有记录,我需要将代码的进一步执行延迟 n
分钟。在 n
分钟过去后,我需要调用相同的代码再次从 table 读取记录并处理它们,一旦处理完所有记录,再次延迟执行 n
number分钟。这需要无限发生,最重要的一点是所有执行都应该发生 synchronously
包括延迟执行,我想完全避免使用 Threading
或 async/await
或任何其他异步编程技术.
找了一会儿,了解到.NET Framework 4.5
,推荐的方法是使用Task.Delay()
方法,不用asycn/await
关键字同步加延迟。所以我创建了一个简单的控制台应用程序,它有一个带有无限循环的 recursive
方法:
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
时遇到了大问题,在 运行 正常使用两天后, Timer
完全停止工作而没有抛出任何异常,因此没有记录任何错误,这非常令人沮丧。
我想避免这种情况,那么实现简单同步代码的 Task.Delay()
的最佳方法是什么?延迟将设置为 2
小时,所以我还想处理 Task.Delay()
将被垃圾收集或从内存中删除或自行停止工作(不抛出任何异常)并重新启动整个系统的情况再次处理。
只需使用 Thread.Sleep(3000)。不确定为什么要避免这种情况。您的代码是同步的,因此您不应该使用 Task。
此外,Task.Delay 使用计时器。所以不确定这是否能解决您的问题。
我会尝试找出 Timer 对象停止工作的原因。听起来不对。
您的计时器回调是否包含了 try catch?
正如其他人指出的那样,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.");
}
}
我正在构建一个 Windows Service
以从 table 读取记录,将记录数据传递给 WCF Service
,等待它的响应并更新数据库中的相同记录,具体取决于来自 WCF Service
的响应。此过程将针对所有记录继续进行,一旦处理完所有记录,我需要将代码的进一步执行延迟 n
分钟。在 n
分钟过去后,我需要调用相同的代码再次从 table 读取记录并处理它们,一旦处理完所有记录,再次延迟执行 n
number分钟。这需要无限发生,最重要的一点是所有执行都应该发生 synchronously
包括延迟执行,我想完全避免使用 Threading
或 async/await
或任何其他异步编程技术.
找了一会儿,了解到.NET Framework 4.5
,推荐的方法是使用Task.Delay()
方法,不用asycn/await
关键字同步加延迟。所以我创建了一个简单的控制台应用程序,它有一个带有无限循环的 recursive
方法:
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
时遇到了大问题,在 运行 正常使用两天后, Timer
完全停止工作而没有抛出任何异常,因此没有记录任何错误,这非常令人沮丧。
我想避免这种情况,那么实现简单同步代码的 Task.Delay()
的最佳方法是什么?延迟将设置为 2
小时,所以我还想处理 Task.Delay()
将被垃圾收集或从内存中删除或自行停止工作(不抛出任何异常)并重新启动整个系统的情况再次处理。
只需使用 Thread.Sleep(3000)。不确定为什么要避免这种情况。您的代码是同步的,因此您不应该使用 Task。
此外,Task.Delay 使用计时器。所以不确定这是否能解决您的问题。
我会尝试找出 Timer 对象停止工作的原因。听起来不对。
您的计时器回调是否包含了 try catch?
正如其他人指出的那样,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.");
}
}