繁体   English   中英

在Application_Start上同时运行多个任务

[英]Running multiple Tasks concurrently on Application_Start

某个友善的灵魂能将我指向正确的方向吗?

基本上,我要实现的是在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调用),但我无需异步运行它们。

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

提前致谢

这是在引导过程中剥离某些工作的好方法吗?

是的,但是那些任务不应该依赖于HttpContext.Current因为在Applicastion_Start事件中不可用,并且有时您的代码可以运行。 因此,一旦您从Application_Start摆脱了此HttpContext ,您就可以了。 您永远不要在后台线程中编写依赖于HttpContext的代码。 永远不能保证存在。 这是一个可能如何中断的示例。 HTTP请求进入,您开始捕获当前上下文的后台任务。 后台任务耗时10秒。 5秒后,HTTP请求已完成执行,并向用户返回了响应。 因此,将其处置。 在第10秒,您尝试在后台任务中使用此捕获的HttpContext(并在此之前处理掉)。 结果是一个很好的小例外。

另外,我希望您知道,如果通过IIS重新启动AppDomain,则可能已经在ASP.NET应用程序中启动的所有后台任务都被打碎了(这基本上可以在不受您控制的情况下发生)。 因此,如果您需要这些任务的持久性,则绝对应该考虑将它们从ASP.NET应用程序卸载到单独的服务中,例如,可以是Windows服务,也可以只是计划由Windows按指定间隔运行的普通控制台应用程序调度程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM