ASP.NET项目,有两个类A和B均实现自IHttpHandler,A正常耗时要3秒,B耗时在毫秒级,在客户端分别用两个线程请求A和B,通过fiddler抓包观察,请求时间几乎同步,按理说AB应该互不干涉,谁先完成就返回,即B很快返回,A大概3秒后返回,但观察下来几乎都是3秒后一起返回,似乎B在等A,极少的情况下才会出现B先返回,但无论同时返回还是先后返回,A和B并不在同一线程执行(通过往响应头写线程id证实),这是为什么?如何让它们之间不等待?
ASP.NET项目,有两个类A和B均实现自IHttpHandler,A正常耗时要3秒,B耗时在毫秒级,在客户端分别用两个线程请求A和B,通过fiddler抓包观察,请求时间几乎同步,按理说AB应该互不干涉,谁先完成就返回,即B很快返回,A大概3秒后返回,但观察下来几乎都是3秒后一起返回,似乎B在等A,极少的情况下才会出现B先返回,但无论同时返回还是先后返回,A和B并不在同一线程执行(通过往响应头写线程id证实),这是为什么?如何让它们之间不等待?
asp.net 中Session实现了读写锁。
你的问题是a.aspx中实现了写锁,阻塞了b.aspx页面对session的访问。
如果想同时访问,请设置a.aspx如下
<%@ Page EnableSessionState="ReadOnly"%>,同样,b.aspx中也要这样设置,因为读锁可以阻塞写锁。
这时b.aspx可以正常访问了。
同样,如果是要自定义实现IHttpHandler,需要在实现IRequiresSessionState和IReadOnlySessionState两个标记接口。
摘自MSDN
https://social.msdn.microsoft...
//这应该涉及到异步
//与同步相对应,是指呼叫另一操作后,不等待其结果,继续执行之后的操作,若之后没有其他操作,当前线程将进入睡眠状态,而CPU时间将有机会切至其他线程。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace 异步调用实现方法汇总
{
/// <summary>
/// 异步调用方法总结:
/// 1.BeginEnvoke EndEnvoke
/// 当使用BeginInvoke异步调用方法时,如果方法未执行完,EndInvoke方法就会一直阻塞,直到被调用的方法执行完毕
/// </summary>
class Program
{
public delegate void PrintDelegate(string s);
static void Main(string[] args)
{
PrintDelegate printDelegate = Print;
Console.WriteLine("主线程");
IAsyncResult result= printDelegate.BeginInvoke("Hello World.", null, null);
Console.WriteLine("主线程继续执行...");
//当使用BeginInvoke异步调用方法时,如果方法未执行完,EndInvoke方法就会一直阻塞,直到被调用的方法执行完毕
printDelegate.EndInvoke(result);
Console.WriteLine("Press any key to continue...");
Console.ReadKey(true);
}
public static void Print(string s)
{
Console.WriteLine("异步线程开始执行:"+s);
Thread.Sleep(5000);
}
}
}
》更多...《
871 阅读
611 阅读
1 回答917 阅读
我想我知道了,AB还同时实现了IRequiresSessionState,不实现该接口就不会阻塞。看来Session这东西对并发有影响,要慎用。