2014-01-14 93 views
0

我有一个C#控制台应用程序,它处理队列(以db为单位)并处理用户上传的内容。 它按计划任务运行。需要时编程运行控制台应用程序

如果某些用户删除了一些内容,则该进程将无法启动,直到它运行。

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

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

是否可以触发从C#代码(MVC控制器)运行的作业\任务?

回答

2

本质上,它听起来像你只是想执行一个异步操作。取决于.NET的版本,有许多选项。例如,Task Parallel Library是调用异步操作的简单方法。因此,如果任务被封装到一些对象(同样的例子,让我们说一个方法叫做叫做content的对象上Process),那么它可能是这样的:

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"); 

虽然分叉所有这些过程都可以看起来很凌乱,可能是非常困难的在错误处理/记录/等方面进行管理。为什么最好将逻辑与应用程序保持在同一个进程中的另一个原因,就是在一个单独的线程中。

+0

我有一个exe(控制台应用程序),我需要从C#代码(MVC控制器)kickstart。 “web应用程序和控制台应用程序共享相同的后端业务逻辑代码”是什么意思? – kheya

+0

@kheya:业务逻辑应该在它自己的程序集(类库项目)中,并且这两个应用程序都应该在解决方案中引用该程序集。因此,当部署每个应用程序时,它都有自己的业务逻辑代码副本。 – David

相关问题