C# 在.NET中执行长时间运行任务的方法
我正在开发一个相当大的网站,其中包括一个客户群和计费计划。每月计费应自动进行(但是,根据业务规则,员工应每月手动单击按钮启动该流程),客户数量在3000-5000之间。在每一张发票上,价格线都应该基于相当多的参数甚至来自Web服务的外部数据进行计算 以上内容肯定是一项(非常)长时间运行的任务,由于应用程序是在IIS上运行的ASP.NET MVC网站,我不希望进程在IIS上自己的线程中运行。我担心的是,如果IIS/Web服务器发生任何事情,计费计算过程也会停止,至少可以说这是至关重要的 因此,我正在寻找替代方案,并已阅读了有关为此类任务创建Windows服务的内容。这是路吗?或者还有其他可能更“现代”的方式来运行长流程吗?该过程必须能够从ASP.NET MVC应用程序启动C# 在.NET中执行长时间运行任务的方法,c#,asp.net,asp.net-mvc,iis,service,C#,Asp.net,Asp.net Mvc,Iis,Service,我正在开发一个相当大的网站,其中包括一个客户群和计费计划。每月计费应自动进行(但是,根据业务规则,员工应每月手动单击按钮启动该流程),客户数量在3000-5000之间。在每一张发票上,价格线都应该基于相当多的参数甚至来自Web服务的外部数据进行计算 以上内容肯定是一项(非常)长时间运行的任务,由于应用程序是在IIS上运行的ASP.NET MVC网站,我不希望进程在IIS上自己的线程中运行。我担心的是,如果IIS/Web服务器发生任何事情,计费计算过程也会停止,至少可以说这是至关重要的 因此,我正
非常感谢任何帮助/提示!:-) 看起来是信号机的一个很好的解决方案: 通常,这是SQL存储的过程/代理作业的理想情况,但如果需要为每个账单调用外部webservices来收集所需数据,则情况并非如此 只要您有账单运行的“标题”记录,您就可以轻松存储您当前使用的记录以及运行是否已完成。无论您是作为windows服务运行还是作为IIS中的线程运行,这将始终是一个考虑因素-有人可以随时关闭计算机 信号员会允许你
- 作为后台任务启动运行
- 轻松地将进度传递回UI
- 允许您从UI停止运行
- 如果用户关闭浏览器,则重新连接到正在运行的运行
- 收听“已完成”事件等
- 允许从多个客户端查看进度
- 长时间运行的IIS任务:您的web服务器不是为执行长时间运行的任务而设计的,例如批处理作业,这本质上就是您的计费任务
- Windows服务:为什么要重新发明轮子,增加学习编写Windows服务的复杂性
--------------------------------------
|Monthly Processing Table |
|------------------------------------|
|MonthlyProcessorId int PK |
|ProcessMonth int |
|ProcessYear int |
|HasBeenProcessed bool |
|CanBeProcessed bool |
|ProcessDate DateTime |
|------------------------------------|
当然,您可以根据需要添加其他字段。这只是一个示范
接下来,创建包含按钮的网页,该按钮应每月按下一次以开始处理。当按下按钮时,应执行以下逻辑:
DateTime.Now
)ProcessMonth
等于DateTime.Now.Month
和ProcessYear
等于DateTime.Now.Year
匹配的行HasBeenProcessed
是否为true
和ProcessDate
,以查看何时将此操作报告给用户,然后您就完成了。这是一个重要的步骤,因为如果行是返回,并且已被处理
为true
,则每月的会费可能已经在本月内运行,您不希望向人员收取双倍的费用。因此,如果HasBeenProcessed
为true,请不要跳过此步骤并停止此处的程序执行逻辑李>
ProcessMonth
设置为DateTime.Now.Month
,ProcessYear
设置为DateTime.Now.Year
。将CanBeProcessed
设置为true
并将HasBeenProcessed
设置为false
已处理的等于false
,可处理的等于true
如果返回了任何行,则只需处理它们,然后在处理它们之后,将ProcessDate
设置为DateTime。现在
并将HasBeenProcessed
设置为true
。最后,您的服务只是回到定期检查。当我说“定期检查”时,我指的可能是每天检查一次,甚至可能是每周检查一次,这取决于您的要求。此服务不应以任何方式使您的SQL server陷入困境
您可以使用一个控制台应用程序来代替Windows服务,该应用程序计划与Windows调度器一起运行。我优先