我有一个C#控制台应用程序来处理队列(在db中)并处理用户上传的内容。 它作为计划任务运行。
如果某个用户删除了某些内容,则该流程将无法启动,直到它运行完毕为止。
如果作业每5分钟运行一次,则必须等待最多5分钟才能运行。 我想立即处理用户内容。
如果user1删除内容,然后user2在30秒后删除内容,我想要运行2个我的作业实例。
是否可以触发job \ task从C#代码(MVC控制器)运行?
答案 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");
虽然分配所有这些进程看起来非常混乱,但在错误处理/日志记录等方面可能很难管理。另一个原因是为什么最好将逻辑保持在与应用程序相同的进程中,只需在一个单独的线程中。