Windows服务递归无限循环,延迟执行同步任务

时间:2017-06-01 07:37:45

标签: c# recursion windows-services .net-4.5 delayed-execution

我正在构建一个Windows Service来从表中读取记录,将记录数据传递给WCF Service,等待其响应并根据{{的响应更新数据库中的相同记录1}}。对于所有记录,此过程将继续,并且一旦处理完所有记录,我需要延迟进一步执行WCF Service分钟的代码。在n分钟过后,我需要调用相同的代码再次从表中读取记录并处理它们,并且在处理完所有记录后,再次延迟执行n分钟。这需要无限发生,最重要的一点是所有执行都应该发生n包括延迟执行,我想完全避免使用synchronouslyThreading或任何其他异步编程技术

搜索了一段时间后,我了解到async/await,推荐的方法是使用.NET Framework 4.5方法而不使用Task.Delay()关键字同步添加延迟。所以我创建了一个简单的控制台应用程序,其中asycn/await方法具有无限循环:

recursive

上面的代码似乎工作正常,但是在另一个Windows服务中实现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."); } } 时遇到了很大的问题,在正常运行两天后,System.Timers.Timer完全停止工作而没有抛出任何异常,所以没有记录错误,这非常令人沮丧。

我想避免这种情况,那么为简单的同步代码实现Timer的最佳方法是什么?延迟将设置为Task.Delay()小时,因此我还想处理2将从内存中收集或删除垃圾或停止自行工作(不抛出任何异常)并重新启动整个事件的情况再过程。

2 个答案:

答案 0 :(得分:1)

只需使用Thread.Sleep(3000)即可。不知道为什么要避免这种情况。您的代码是同步的,因此您不应该使用任务。

此外,Task.Delay使用Timer。所以不确定这是否能解决你的问题。

我试着找出Timer对象停止工作的原因。这听起来不对。

您的计时器回调是否包含try catch?

答案 1 :(得分: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.");
  }
}