快捷搜索:  xxx  as  推理研究所  幼幼  侦探研究所

永乐国际登录网站:异步队列控制处理aspx请求实现示例



当一个aspx页面哀求处置惩罚包括大年夜量的IO事情,而这些IO资本又异常有限的环境下,那这个页面在对面大年夜量哀求的时刻就有可能导致大年夜量线程等待处置惩罚,从而使利用法度榜样线程开销过多影响整体的处置惩罚效能.在这种环境我们更盼望经由过程一个行列步队的机制节制处置惩罚线程的开销来实现更高效的处置惩罚效能.是以.net供给IHttpAsyncHandler来办理这些工作,但有个问题便是实现一个IHttpAsyncHandler意味着要自己要实现自己的处置惩罚历程,并不能对已经实现功能的.aspx进行节制.但经由过程反编译.net代码来看可以实现一个IHttpAsyncHandler接收现有的.aspx页面实现异步处置惩罚,又不必要改动现有页面实现的代码.下面具体讲述实现过

从.net的web设置设置设备摆设摆设文件来看asp.net默认处置惩罚aspx的并不是IHttpHandler而是System.Web.UI.PageHandlerFactory,反编译代码看下

[PermissionSet(SecurityAction.InheritanceDemand, Unrestricted = true), PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)]

public class PageHandlerFactory : IHttpHandlerFactory2, IHttpHandlerFactory

{

private bool _isInheritedInstance;

protected internal PageHandlerFactory()

{

this._isInheritedInstance = (base.GetType() != typeof(PageHandlerFactory));

}

public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string virtualPath, string path)

{

return this.GetHandlerHelper(context, requestType, VirtualPath.CreateNonRelative(virtualPath), path);

}

IHttpHandler IHttpHandlerFactory2.GetHandler(HttpContext context, string requestType, VirtualPath virtualPath, string 永乐国际登录网站physicalPath)

{

if (this._isInheritedInstance)

{

return this.GetHandler(context, requestType, virtualPath.VirtualPathString, physicalPath);

}

return this.GetHandlerHelper(context, requestType, virtualPath, physicalPath);

}

public virtual void ReleaseHandler(IHttpHandler handler)

{

}

private IHttpHandler GetHandlerHelper(HttpContext context, string requestType, VirtualPath virtualPath, string phy永乐国际登录网站sicalPath)

{

Page page = BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page), context, true) as Page;

if (page == null)

{

return null;

}

page.TemplateControlVirtualPath = virtualPath;

return page;

}

}

从反编译的代码来看,看到的盼望.首先PageHandlerFactory是可以承袭的,而GetHandler又是可重写的,有了这两个前提完全可以满意我们的必要.经由过程一连PageHandlerFactory就可以直接处置惩罚现有的aspx文件.

实现IHttpAsyncHandler

既然可以重写PageHandlerFactory的GetHandler,而IhttpAsyncHandler又是承袭IHttpHandler;那工作就变得永乐国际登录网站简单多了可能经由过程构建一个IhttpAsyncHandler直接返回.

public class CustomPageFactory : System.Web.UI.PageHandlerFactory

{

static CustomPageFactory()

{

G_TaskQueue = new TaskQueue(20);

}

public static TaskQueue G_TaskQueue;

public override IHttpHandler GetHandler(HttpContext context, string requestType, string virtualPath, string path)

{

AspxAsyncHandler handler = new AspxAsyncHandler(base.GetHandler(context, requestType, virtualPath, path));

return handler;

}

}

可以实现一个IHttpAsyncHandler把PageHandlerFactory返回的IHttpHandler从新包装一下

public class AspxAsyncHandler : IHttpAsyncHandler

{

public AspxAsyncHandler(IHttpHandler handler)

{

mHandler = handler;

}

private IHttpHandler mHandler;

public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)

{

AspxAsyncResult result = new AspxAsyncResult(context, mHandler, cb);

CustomPageFactory.G_TaskQueue.Add(result);

return result;

}

public void EndProcessRequest(IAsyncResult result)

{

}

public bool IsReusable

{

get { return false; }

}

public void ProcessRequest(HttpContext context)

{

throw new NotImplementedException();

}

}

这样一个异步处置惩罚的httphandler就包装完了.我们只必要经由过程设置设置设备摆设摆设httphandler就可以实现对现有的aspx进行异军行列步队处置惩罚.

handlers>

add name="custompage" verb="*" path="*.aspx" type="WebApp.Code.CustomPageFactory,WebApp"/>

handlers>

行列步队和线程节制

在处置惩罚的历程中并没有应用线程池来完成详细的事情,假如每个直接调用线程池那同样面临的问题便是线池线耗呈现大年夜量线程调整问题影响机能.以是在上面实现IHttpAsyncHandler的BeginProcessRequest措施中是构建一个IAsyncResult添加到行列步队中.之于这个行列步队的实现比拟较较简单:

public class TaskQueue

{

public TaskQueue(int group)

{

mDispatchs = new List(group);

for (int i = 0; i

{

mDispatchs.Add(new Dispatch());

}

}

private IList mDispatchs;

private long mIndex = 0;

private int GetIndex()

{

return (int)System.Threading.Interlocked.Increment(ref mIndex) % mDispatchs.Count;

}

public void Add(AspxAsyncResult aspAsync)

{

if (aspAsync != null)

{

mDispatchs[GetIndex()].Push(aspAsync);

}

}

class Dispatch

{

public Dispatch()

{

System.Threading.ThreadPool.QueueUserWorkItem(OnRun);

}

private Queue mQueue = new Queue(1024);

public void Push(AspxAsyncResult aspAR)

{

lock (this)

{

mQueue.Enqueue(aspAR);

}

}

private AspxAsyncResult Pop()

{

lock (this)

{

if (mQueue.Count > 0)

return mQueue.Dequeue();

return null;

}

}

private void OnRun(object state)

{

while (true)

{

AspxAsyncResult asyncResult = Pop();

if (asyncResult != null)

{

asyncResult.Execute();

}

else

{

System.Threading.Thread.Sleep(10);

}

}

}

}

}

为了更好地节制线程,行列步队的实现是采纳多行列步队多线程机制,便是根据你必要的并发环境来指定线程行列步队数来处置惩罚,当然这种设计是对照古板并不机动,假如想设计机动一点是根据当前行列步队的处置惩罚环境和资本环境来动态谋略扩冲现有行列步队线程数.

IAsyncResult实现

异步返回处置惩罚工具实现也很简单,实现一个Execute措施由行列步队履行,履行完成后经由过程callBack措施来看护处置惩罚完成.

public c永乐国际登录网站lass AspxAsyncResult : IAsyncResult

{

bool m_IsCompleted = false;

private IHttpHandler mHandler;

private HttpContext mContext;

private AsyncCallback m_Callback;

public AspxAsyncResult(HttpContext context, IHttpHandler handler, AsyncCallback cb)

{

mHandler = handler;

mContext = context;

m_Callback = cb;

}

#region IAsyncResult 成员

public object AsyncState

{

get { return null; }

}

public WaitHandle AsyncWaitHandle

{

get { return null; }

}

public bool CompletedSynchronously

{

get { return false; }

}

public bool IsCompleted

{

get { return m_IsCompleted; }

}

#endregion

public void Execute()

{

try

{

mHandler.ProcessRequest(mContext);

}

catch

{

}

finally

{

try

{

if (m_Callback != null)

m_Callback(this);

}

catch

{

}

m_IsCompleted = true;

}

}

}

测试效果

为了验证这种实现的有效性进行了一个简单的测试,一个web页面造访一个逻辑办事,而交互历程连接池有线只有20个连接,假如当前连接池空了就永乐国际登录网站必须等待其他连接管受接收.测试环境如下

没用异步处置惩罚的环境:

应用了异步处置惩罚的环境(固定15线程处置惩罚):

从测试结果来看在没异步处置惩罚的时刻存在大年夜量哀求差错的同时,还存在大年夜量的CPU资本损耗,而应用异步处置惩罚的测试结果全部处置惩罚历程中都维持平稳使有环境.当然同时要面对便是低落了一些处置惩罚量和在延时上高点,但这些都可以经由过程设置调整线程来达到一个更好的结果.

总结

从测试结果可以看到异步httphandler加行列步队节制在某些场可以很好的节制线程的处置惩罚前进系统的稳定性和处置惩罚效能,更紧张的一点是可以经由过程设置设置设备摆设摆设httphandler对现有的aspx进行异步哀求处置惩罚,当然在设置设置设备摆设摆设的时刻我们没有需要针对所有aspx,只必要针对某些存IO操作而并发量又比拟较较高的aspx即可.

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: