在Application_Start上同时运行多个任务

时间:2015-12-30 15:02:33

标签: c# .net asp.net-mvc task-parallel-library

一些友善的灵魂能否指引我走向正确的方向。

基本上我想要实现的是在Web应用程序启动期间做一些工作。主要是热身活动和设置任务。

这些任务是彼此独立的,并且它们不共享任何状态,所以我认为同时运行它们可能是个好主意。

我到目前为止所提出的解决方案如下:

    public void Execute()
    {
        IEnumerable<IStartupTask> startupTasks = PrepareStartupTasks();

        Task.Factory.StartNew(httpContext =>
        {
            HttpContext.Current = httpContext as HttpContext;

            Parallel.ForEach(startupTasks, startupTask => startupTask.Execute());                

        }, HttpContext.Current);            
    }

我想要实现的是尽可能快地在线程池线程上运行此独立工作并完成预热。

这是应用程序的开始,所以我没有必要异步运行它们,尽管其中一些任务执行了一些I / O(主要是API调用)。

这是在引导程序中分离一些工作的好方法吗?似乎工作但我可能会错过一些潜在的陷阱,这就是为什么我在这里:)

提前致谢

1 个答案:

答案 0 :(得分:2)

  

这是在引导程序中分离一些工作的好方法吗?

是的,但这些任务不应该依赖于HttpContext.Current,因为Applicastion_Start事件中没有这个任务,而且有时您的代码有效。所以,一旦你从HttpContext中删除这个Application_Start,你就可以了。你永远不应该在后台线程中编写依赖于HttpContext的代码。这永远不会保证存在。这是一个如何打破这个例子的例子。 HTTP请求进入,您启动捕获当前上下文的后台任务。后台任务需要10秒钟。 HTTP请求在5秒后完成执行并返回对用户的响应。因此它被处理掉了。在第10秒,您尝试在后台任务中使用捕获的(并且在那时被处置)HttpContext。结果是一个很好的例外。

此外,我希望您知道,如果IIS重新启动AppDomain,那么您在ASP.NET应用程序中启动的所有后台任务可能会被分成几部分(这基本上可能在您无法控制的情况下发生) 。因此,如果您需要这些任务的持久性,您一定要考虑将它们从ASP.NET应用程序卸载到单独的服务中 - 例如,可以是Windows服务,或者只是一个简单的控制台应用程序,计划在Windows按指定的时间间隔运行调度器。