.NET控制台应用程序与web应用程序一起处理长时间运行的任务

.NET控制台应用程序与web应用程序一起处理长时间运行的任务,.net,console-application,.net,Console Application,我的ASP.NET web应用程序提供了导入功能,基本上可以接受excel电子表格。然后需要对电子表格进行处理、解析、验证等。这可能需要相当长的时间,具体取决于电子表格的大小。 我决定编写一个控制台应用程序,负责处理长时间运行的任务,而不是在web应用程序上执行此操作 该体系结构非常简单,有一个名为“job_queue”的表,web应用程序在每次启动导入时都会写入该表,其中包含导入所需的所有信息。然后,控制台应用程序从队列中拾取未完成的作业,对它们进行处理,并将它们标记为已完成,这样它们就不会被

我的ASP.NET web应用程序提供了导入功能,基本上可以接受excel电子表格。然后需要对电子表格进行处理、解析、验证等。这可能需要相当长的时间,具体取决于电子表格的大小。 我决定编写一个控制台应用程序,负责处理长时间运行的任务,而不是在web应用程序上执行此操作

该体系结构非常简单,有一个名为“job_queue”的表,web应用程序在每次启动导入时都会写入该表,其中包含导入所需的所有信息。然后,控制台应用程序从队列中拾取未完成的作业,对它们进行处理,并将它们标记为已完成,这样它们就不会被再次拾取

控制台应用程序需要始终处于待机模式,通过反复检查“作业队列”表,随时准备接收新作业

我的问题是,控制台应用程序的最佳解决方案是什么

目前,我有这样的东西,永远运行。但是,它似乎非常占用资源,有时会挂起,需要重新启动控制台应用程序

public static void Main(string[] args)
{
    while (true) // Keep repeating the same thing
    {
        ProcessJobs();
    }
}
我如何改进这段代码,使其更具资源友好性和健壮性


提前感谢

最简单的方法可能是设置一个Windows计划任务,以便按计划执行控制台应用程序。您可以从控制台中删除while循环,只需依赖Windows即可根据需要经常运行控制台应用程序


Windows计划任务还可以配置为在出现故障或无响应时自动重新启动。

我认为使用计划任务不是更好的解决方案,因为在获取下一个文件之前,您会一直查询数据库。效率不高。 相反,您可以使用FileSystemWatcher在磁盘上创建新文件时获得通知,然后处理该文件

另一个选项-如果您的过程更复杂(例如:您希望能够继续从文件中间读取,您希望在特定时间处理特定文件),则可以使用WWF:


HTH

我最终采用了这种方法。我将计划任务设置为每5分钟运行一次控制台应用程序,然后退出(而不是无限循环)。这就解决了进程挂起的问题,因为每次都会启动一个新进程。唯一的缺点是控制台应用程序处理新的后台作业的最大等待时间为5分钟。电子表格文件存储在数据库中,而不是文件系统中。