我有一个 MVC4 应用程序,我需要在其中初始化一个长时间运行的进程。目前,此过程的代码位于控制台应用程序中,该应用程序作为服务安装在 topshelf 中。我让进程每隔几秒钟检查一次数据库以查看它是否需要运行,但这不是解决方案。我需要一种方法让 MVC4 应用程序启动该过程并忘记它,但是当响应返回给客户端时,该过程不会与 Web 应用程序一起卸载。
有人可以指出我正确的方向吗?
我有一个 MVC4 应用程序,我需要在其中初始化一个长时间运行的进程。目前,此过程的代码位于控制台应用程序中,该应用程序作为服务安装在 topshelf 中。我让进程每隔几秒钟检查一次数据库以查看它是否需要运行,但这不是解决方案。我需要一种方法让 MVC4 应用程序启动该过程并忘记它,但是当响应返回给客户端时,该过程不会与 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 之间的任何值(包括 128-256)。
我们在我们的网络应用程序中使用了一个类似的系统,它允许用户提交“作业”,然后由 Windows 服务运行。Web 应用程序向 Windows 服务发送命令,让其知道已提交新作业。然后该服务转到数据库以获取有关要执行的作业的信息。