2017-06-01 70 views
1

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

寻找一段时间后,我已经了解到,与.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."); 
     } 
    } 

上面的代码似乎工作正常,但在另一个窗口服务实现System.Timers.Timer当我面临很大的问题,有两个正常运行后,天,Timer完全停止工作,没有抛出任何异常,所以没有记录错误,这是非常令人沮丧的。

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

+0

这将产生一个堆栈溢出(一段时间后)。 –

+0

@SirRufo任何其他替代我想要达到的目标? – seadrag0n

+0

是的,阅读一些关于递归的教程来得到一个概念,为什么你不应该在这里使用它 –

回答

1

只要使用Thread.Sleep(3000)。不知道为什么你想避免这种情况。你的代码是同步的,所以你不应该使用任务。

此外,Task.Delay使用一个计时器。所以不知道这是否会解决您的问题。

我试着弄清楚为什么Timer对象停止工作。这听起来不对。

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

+0

是的,它被包裹在一个try catch中,并且所有的错误都被记录到数据库......对我的问题,任何其他'Thread的替代品。睡眠()'为什么我想要实现? – 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."); 
    } 
}