2013-10-07 52 views
0

我有一个MVC4应用程序,我需要启动一个长时间运行的进程。目前,此过程的代码位于一个控制台应用程序中,并作为带有顶架的服务进行安装。我每隔几秒就会检查一次数据库,看看它是否需要运行,但这不是一个解决方案。我需要一种方式让MVC4应用程序启动流程并忘记它,但是当响应返回给客户端时,流程不会与Web应用程序一起卸载。如何调用可执行文件从MVC Web应用程序启动服务

有人能指出我正确的方向吗?

+1

为什么轮询数据库不是解决方案? – David

+0

如果我想及时将报告结果返回给客户端,那么我必须每秒都做一次(这是不必要的开销和23.5小时内的数据库访问,它不会被使用),或者从外部初始化进程。我更喜欢每个进程运行不会触及数据库10,000次。 – Difinity

回答

1

如果我理解你的问题,你可以做的是,在服务(这是一个从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服务发送一条命令,让它知道一个新的作业已经提交。该服务然后转到数据库以获取有关要执行的作业的信息。

+0

抱歉没有及时检查。这帮助了很多。现在我遇到了服务器不允许安装服务的问题。还有一个窗口问题需要处理8-S – Difinity

+0

@Difinity:如果需要按需执行一次流程,偶尔按计划执行,那么为什么不共享控制台应用程序和Web应用程序之间的后端代码?如果代码被抽象到两个应用程序共享的模块中,那么Web应用程序不需要调用服务,它只会将代码作为Web应用程序的一部分运行。 – David

相关问题