【问题标题】:Running a console app programmatically whenever needed在需要时以编程方式运行控制台应用程序
【发布时间】:2017-12-08 21:56:23
【问题描述】:

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

如果某些用户丢弃了某些内容,该进程将在它运行之前不会拾取它。

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

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

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

【问题讨论】:

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


    【解决方案1】:

    从本质上讲,您似乎只是在寻找执行异步操作。根据 .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");
    

    尽管分叉所有这些进程看起来很混乱,并且在错误处理/日志记录/等方面可能很难管理。最好将逻辑与应用程序保持在同一进程中的另一个原因,只是在单独的线程中。

    【讨论】:

    • 我有一个 exe(控制台应用程序),需要从 C# 代码(MVC 控制器)启动。 “Web 应用程序和控制台应用程序共享相同的后端业务逻辑代码”是什么意思?
    • @kheya:业务逻辑应该在自己的程序集(类库项目)中,并且两个应用程序都应该在解决方案中引用该程序集。因此,当每个应用程序部署时,它都有自己的业务逻辑代码副本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    相关资源
    最近更新 更多