【发布时间】:2017-06-01 07:37:45
【问题描述】:
我正在构建一个Windows Service 来从表中读取记录,将记录数据传递给WCF Service,等待它的响应并根据WCF Service 的响应更新数据库中的相同记录。对于所有记录,此过程将继续进行,一旦处理完所有记录,我需要将代码的进一步执行延迟n 分钟数。在n 分钟过去后,我需要调用相同的代码再次从表中读取记录并处理它们,一旦处理完所有记录,再次延迟执行n 分钟数。这需要无限发生,最重要的一点是所有执行都应该发生synchronously,包括延迟执行,我想完全避免使用Threading 或async/await 或任何其他异步编程技术。
搜索while后得知,使用.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() 将被垃圾收集或从内存中删除或停止自行工作(不抛出任何异常)并重新启动整个过程的情况。
【问题讨论】:
-
这将产生堆栈溢出(一段时间后)。
-
@SirRufo 除了我想要达到的目标还有其他选择吗?
-
是的,阅读一些关于递归的教程来了解为什么你不应该在这里使用它
标签: c# recursion windows-services .net-4.5 delayed-execution