在需要时以编程方式运行控制台应用程序

时间:2014-01-14 00:59:29

标签: asp.net-mvc-3 automation job-scheduling

我有一个C#控制台应用程序来处理队列(在db中)并处理用户上传的内容。 它作为计划任务运行。

如果某个用户删除了某些内容,则该流程将无法启动,直到它运行完毕为止。

如果作业每5分钟运行一次,则必须等待最多5分钟才能运行。 我想立即处理用户内容。

如果user1删除内容,然后user2在30秒后删除内容,我想要运行2个我的作业实例。

是否可以触发job \ task从C#代码(MVC控制器)运行?

1 个答案:

答案 0 :(得分:2)

基本上,听起来你只是想要执行异步操作。根据.NET的版本,有许多选项。例如,Task Parallel Library是调用异步操作的简单方法。因此,如果任务被封装到某个对象中(对于相同的示例,假设在名为Process的对象上使用名为content的方法),那么它可能如下所示:

var processContent = new Task(() => content.Process());
processContent.Start();

然后,任务将以异步方式继续,并且流控制将返回到应用程序(这在Web应用程序中尤其理想,您不希望用户自然地看到无响应的浏览器)。

如果您使用的是.NET 4.5,您也可以使用the async and await keywords来使其更清晰一些。从本质上讲,您正在谈论在a separate thread中运行流程。

这一切都假定Web应用程序和控制台应用程序共享相同的后端业务逻辑代码。当然,这可能可能他们应该做什么。如果由于某种原因这不是一个选项(我建议考虑使其成为一个选项),您可以从代码中start a process。它可能很简单:

Process.Start("C:\Path\To\ConsoleApplication.exe");

虽然分配所有这些进程看起来非常混乱,但在错误处理/日志记录等方面可能很难管理。另一个原因是为什么最好将逻辑保持在与应用程序相同的进程中,只需在一个单独的线程中。