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 包括延迟执行,我想完全避免使用 Threadingasync/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.");
  }
}