【发布时间】:2011-02-24 20:24:49
【问题描述】:
我已经为这个解决方案搜索了高低。任何见解都将受到高度赞赏。
情况:当单个页面中有多个PageMethod调用时,每个方法调用都持有Session对象的锁,从而阻塞。 PageMethod 调用只能在 @Page 指令变为 False|ReadOnly 时进行异步调用
发现:当Page 指令是默认的(读/写)但会话没有在页面上的任何地方使用时,调用不会被阻止。在页面级别对会话的任何读取或写入都会阻止页面方法调用。
问题:在@Page 指令中创建EnableSessionState=ReadOnly 非常受限制,并且不想走那条路。
pagemethod 调用可以不阻塞吗?并且仍然访问会话? (可能不是写,只是读)
【问题讨论】:
-
那么,为什么要使用 PageMethods?为什么不创建 WCF 服务来满足您的需求?
-
我的猜测是 Session 不是线程安全的,因此 PageMethods 阻塞,因为它们超出了正常的请求/响应周期 - 可以从用户正在查看的页面同时调用许多 PageMethods。有必要如此频繁地调用您的 PageMethods 吗?你能改变设计吗? programminglife.wordpress.com/2009/05/18/… 似乎通过实现异步模式提供了一种解决方法。页面底部的评论甚至说如果您从 Global.asax 中删除 Session_Start/Session_End 处理程序,会话将不会被锁定。
-
@WiseGuyEh:上面的链接确保 PageMethod 调用是真正并行的,并且 Session 可用于页面(因此不要将 @Page EnableSessionState 设置为 ReadOnly) - 但是 BeginInvoke 创建了一个新的线程并且该线程不是会话感知的,因为它不是页面周期的一部分。
标签: c# asp.net asp.net-ajax asynchronous