【问题标题】:Can you await session state operations in .NET?您可以等待 .NET 中的会话状态操作吗?
【发布时间】:2014-06-27 14:23:01
【问题描述】:

我看不到在 .NET 中等待会话状态操作的方法。我意识到这几乎没有用,甚至更糟,如果会话状态存储在进程中,可能只会增加开销,但是如果会话状态通过数据库、状态机或其他设备的线路保持不变,那就太好了等待会话状态操作。

【问题讨论】:

  • 我迷路了...例子?
  • 假设您只是从 HttpContext.Current.Session[key] 获取会话数据。这是不可等待的。这是同步的。所以如果我没记错的话,这个线程会在等待状态机或数据库返回结果时阻塞。
  • 是的,调用线程将在处理请求时阻塞。但是你可以创建一个Tasks 这个方法......
  • 一位同事刚刚指出,会话数据可能会在管道中较早加载(甚至在您请求之前),因此等待结果没有意义。如果是这种情况,那么我可以理解为什么别无选择。我只是想确定一下,因为我认为如果会话通过网络存储在数据库或状态机上会很好......
  • 这取决于会话提供程序,我已经构建了自己的 SQL 会话提供程序,并且请求按上述方式处理,如果发生任何抢先加载,则它是特定于实现的。

标签: .net async-await session-state


【解决方案1】:

我相信从Session 读取始终是仅CPU 操作。加载会话状态发生在管道中的某个早期点。加载步骤确实会受益于异步。从字典中阅读应该保持一如既往。

不幸的是,SessionStateStoreProviderBase 类只有同步方法。从它派生不足以实现异步加载。使用同步接口,内部不可能是异步的。 Task.Run(...).Wait(); 将是您在这里能做的最糟糕的事情。

我不知道有什么方法可以轻松扩展 ASP.NET 管道,但它可能是可行的。管道已经支持异步步骤。您可能能够在同步会话状态加载步骤尚未运行的管道中的某个点运行加载步骤。即使在 ASP.NET 要求您之前,您也可以异步加载会话状态。当 ASP.NET 要求您返回预先计算的结果时。

更新:这比我想象的要容易。 HttpApplication 类具有将异步事件处理程序附加到管道的简单方法。只需选择加载会话状态之前的一个。

我不知道这是否值得。会话状态操作通常非常快。异步 IO 使 IO 使用更多的 CPU 时间。它在服务器上吸引人的原因是它解除了线程阻塞。比 1 毫秒的数据库调用更适合几秒钟的 Web 服务调用。

不过,您绝对可以在同一个 HTTP 请求中混合使用同步和异步。所以那里没有问题。请不要致电WaitTask.Run

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2010-09-21
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多