【问题标题】:Running multiple Tasks concurrently on Application_Start在 Application_Start 上同时运行多个任务
【发布时间】:2015-12-30 23:11:31
【问题描述】:

一些友好的灵魂能指引我正确的方向吗?

基本上我想要实现的是在 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 调用)。

这是在引导过程中分拆一些工作的好方法吗?似乎有效,但我可能会错过一些潜在的陷阱,这就是我在这里的原因:)

提前致谢

【问题讨论】:

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


    【解决方案1】:

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

    是的,但这些任务不应依赖于HttpContext.Current,因为这在Applicastion_Start 事件中不可用,而且有时您的代码可以正常工作。所以一旦你从你的Application_Start 中摆脱了这个HttpContext,你会没事的。你永远不应该在后台线程中编写依赖于 HttpContext 的代码。这永远不能保证存在。这是一个如何破坏的示例。一个 HTTP 请求进来,你启动一个后台任务来捕获当前上下文。后台任务假设需要 10 秒。 HTTP 请求在 5 秒后执行完毕,并向用户返回响应。因此,它被处置。在第 10 秒,您尝试在后台任务中使用这个捕获的(并且到那时已处置)HttpContext。结果是一个不错的小例外。

    另外我希望您知道,如果 IIS 重新启动 AppDomain,您可能在 ASP.NET 应用程序中启动的所有后台任务都可能被撕成碎片(这基本上可能发生在您无法控制的情况下) .因此,如果您需要这些任务的持久性,您绝对应该考虑将它们从您的 ASP.NET 应用程序卸载到一个单独的服务中——例如,它可以是一个 Windows 服务或只是一个普通的控制台应用程序,它被安排在 Windows 指定的时间间隔运行调度程序。

    【讨论】:

    • 如果您不喜欢编写自己的 Windows 服务,请使用执行此操作的现有库之一。看看这个帖子hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx
    • 谢谢!我知道 AppDomain 可以关闭,但这不是问题,因为这些不是一些关键的、持久的操作。在这种情况下,只要 AppDomain 重新启动,就可以再次运行它们。我唯一的问题是其中一项任务在内部使用 HttpContext 并做一些事情,我想知道如何处理它。
    • 如果它是后台任务,根据定义,它不应该依赖或绑定到任何 HTTP 上下文。如果是这样,那么我担心你可能做错了什么。
    • 不幸的是,代码不属于我的所有权和反编译我注意到它在内部使用上下文。我可能会重新考虑该操作的性质并将其移出后台任务。
    • 不幸的是,在这种情况下,我所能做的就是祝你好运。只需确保将一些错误日志记录到您的后台任务中,以便您知道如何从已处理的 HTTP 上下文中手动恢复失败的任务。此外,捕获您将在后台线程中获得的未处理异常可能是一个好主意,以避免每次您运气不佳并遇到已处理的 HTTP 上下文时都关闭您的 AppDomain。恐怕这个问题没有灵丹妙药。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    相关资源
    最近更新 更多