代码之家  ›  专栏  ›  技术社区  ›  dance2die

要在ASP中线程化生成页面的请求吗

  •  0
  • dance2die  · 技术社区  · 7 年前

    真正地

    有没有办法做到这一点?

    谢谢

    2 回复  |  直到 17 年前
        1
  •  1
  •   Rex M    17 年前

    通过使用请求和会话数据的外观,您完全可以做到这一点。然而,这将要求您更改页面中的所有代码以使用facade,而不是直接调用请求或会话。

    HttpRuntime.Cache . 将该对象的标识符传递到线程中,以便线程知道要使用哪个SessionData对象。

    如果您在特殊工作线程中,可以使用ID实例化SessionFacade。否则,不使用参数实例化它。

    下面是SessionFacade的一个示例,希望足以让您开始:

    class SessionFacade
    {
        private string _threadID;
    
        public SessionFacade() { }
    
        public SessionFacade(string threadID)
        {
            this._threadID = threadID;
        }
    
        public object this[string key]
        {
            get
            {
                return this.GetData(key);
            }
        }
    
        protected object GetData(string key)
        {
            if(!string.IsNullOrEmpty(this._threadID))
            {
                return ((SessionData)HttpRuntime.Cache[this._threadID])[key];
            }
            else
            {
                return Session[key];
            }
        }
    }
    
        2
  •  0
  •   dance2die    17 年前

    在我们的特殊情况下,问题是我们请求的每个页面都有一个会话锁。这使得一次无法访问多个页面:

    http://blogs.msdn.com/amitsh/archive/2007/08/01/why-i-cannot-execute-two-requests-from-the-same-session-simultaneously-for-an-asp-net-application.aspx

    这是预期的行为。原因 这背后是会话状态 实现读写器锁定

    • 默认情况下,将写入程序锁定在 会话,直到请求完成。

    • 具有会话状态读取访问权限的页(或帧)(例如,<%@页) 直到请求完成。

    • 正如我们可以理解的,基于锁的概念,读卡器锁将 锁将阻止所有读写器

    收单机构equestState并于年发布 事件的ReleaseRequestState 要求这就是为什么如果两个 帧/页都具有会话状态 除非你使用 EnableSessionState=“ReadOnly”),一个 帧/页必须等待其他帧/页 结束。

    通过将EnableSessionState设置为ReadOnly,我们可以在后台等待第一个页面完成执行的同时推送重定向(从而请求另一个页面)。

    推荐文章