我有一个MVC4应用程序,我需要启动一个长时间运行的进程。目前,此过程的代码位于一个控制台应用程序中,并作为带有顶架的服务进行安装。我每隔几秒就会检查一次数据库,看看它是否需要运行,但这不是一个解决方案。我需要一种方式让MVC4应用程序启动流程并忘记它,但是当响应返回给客户端时,流程不会与Web应用程序一起卸载。如何调用可执行文件从MVC Web应用程序启动服务
有人能指出我正确的方向吗?
我有一个MVC4应用程序,我需要启动一个长时间运行的进程。目前,此过程的代码位于一个控制台应用程序中,并作为带有顶架的服务进行安装。我每隔几秒就会检查一次数据库,看看它是否需要运行,但这不是一个解决方案。我需要一种方式让MVC4应用程序启动流程并忘记它,但是当响应返回给客户端时,流程不会与Web应用程序一起卸载。如何调用可执行文件从MVC Web应用程序启动服务
有人能指出我正确的方向吗?
如果我理解你的问题,你可以做的是,在服务(这是一个从ServiceBase派生类),覆盖OnCustomCommand:
private const int MY_CUSTOM_COMMAND = 140;
protected override void OnCustomCommand(int command)
{
if (command == MY_CUSTOM_COMMAND)
{
... Do stuff here ...
}
}
然后,您可以在您的业务触发命令,从一些外部应用沿着这些线路:
private const int MY_CUSTOM_COMMAND = 140;
using (ServiceController sc = new ServiceController("MyTaskService", "ServiceMachine"))
{
sc.ExecuteCommand(MY_CUSTOM_COMMAND);
}
这就是基本思想。自定义命令可以是128-256之间的任何值。
我们在我们的网络应用程序中使用了一个类似的系统,它允许用户提交随后由Windows服务运行的“作业”。 Web应用程序向Windows服务发送一条命令,让它知道一个新的作业已经提交。该服务然后转到数据库以获取有关要执行的作业的信息。
为什么轮询数据库不是解决方案? – David
如果我想及时将报告结果返回给客户端,那么我必须每秒都做一次(这是不必要的开销和23.5小时内的数据库访问,它不会被使用),或者从外部初始化进程。我更喜欢每个进程运行不会触及数据库10,000次。 – Difinity