【问题标题】:async await with .net 4.0 - maintain static context.net 4.0 的异步等待 - 维护静态上下文
【发布时间】:2013-12-02 08:06:51
【问题描述】:

我有一个使用 BCL async/await 包的 MVC 4.0 站点。 为了在初始线程和后续线程(等待之后)中保留 HttpContext,我首先创建了一个引用上下文的闭包,如下所示:

   public async Task<ViewResult> GetCustomer(int id)
      {            
       var ctx =  HttpContext.Current;
       ctx["test"] = "test";

       await DoSomeLongRunningIO();

       var test = ctx["test"];
       //do other things with context

       return View();
    }

但是,我需要在等待之后调用各种服务。这些遗留服务直接调用 HttpContext.Current。 所以我用下面的代码解决了这个问题,这似乎是一种确保这些服务仍然按预期工作的简单方法。

  public async Task<ViewResult> GetCustomer(int id)
      {            
       var ctx =  HttpContext.Current;

       await DoSomeLongRunningIO();

       HttpContext.Current = ctx;

       //call other services which use static references to httpcontext
       return View();
    }

这确实有效,但我一直在阅读this answer that suggests it is a bad idea:

  1. 这是一个坏主意,如果是,为什么它比第一个示例更糟糕?

感谢您的宝贵时间。

【问题讨论】:

    标签: asp.net-mvc-4 async-await c#-5.0


    【解决方案1】:

    你知道async/await in an ASP.NET app on .NET 4.0 is undefined吗?

    如果您升级到 .NET 4.5,您会发现 HttpContext 会自动为您保留。不需要关闭或设置它。

    设置HttpContext.Current 是个坏主意,因为您绕过了确保在该上下文中一次只有一个线程的 ASP.NET 安全检查。

    【讨论】:

    • 感谢您的回复。当我们说未定义时,这是什么意思? (我确实阅读了链接,但不清楚)。不幸的是,我目前无法使用 4.5。从我上面的代码中,我认为我永远不会处于一次有 2 个线程和一个上下文的位置?它总是 1 个线程和 1 个上下文(在任何时候)。
    • @jonho:“未定义”是“未定义行为”的简写。这意味着它不会正常工作。
    • 我决定改用 TPL。
    • 在您引用的帖子中,它指出行为未定义如果您不设置 *aspnet:UseTaskFriendlySynchronizationContext* 标志。如果您仅将此标志设置为 true,同时仍将 .Net4 与 BCL 包一起使用会怎样?这会按预期工作吗(即拥有完整的 .Net4.5 框架)?
    • @julealgon:没有。UseTaskFriendlySynchronizationContext 标志是在 ASP.NET 4.5 中引入的。它在 ASP.NET 4.0 上没有任何意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    相关资源
    最近更新 更多