我正在构建一个Windows Service
来从表中读取记录,将记录数据传递给WCF Service
,等待其响应并根据{{的响应更新数据库中的相同记录1}}。对于所有记录,此过程将继续,并且一旦处理完所有记录,我需要延迟进一步执行WCF Service
分钟的代码。在n
分钟过后,我需要调用相同的代码再次从表中读取记录并处理它们,并且在处理完所有记录后,再次延迟执行n
分钟。这需要无限发生,最重要的一点是所有执行都应该发生n
包括延迟执行,我想完全避免使用synchronously
或Threading
或任何其他异步编程技术
搜索了一段时间后,我了解到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
将从内存中收集或删除垃圾或停止自行工作(不抛出任何异常)并重新启动整个事件的情况再过程。
答案 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.");
}
}