建体彩网|中彩网双色球连号|
?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

澳門黃金城官網app:異步隊列控制處理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澳門黃金城官網appsicalPath)

{

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 nam澳門黃金城官網appe="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

{

mDispa澳門黃金城官網apptchs.Add(new Dispatch());

}

}

private IList mDispatchs;

private long mIndex = 0;

private int GetIndex()

{

return (int)System.Threading.Interlocked.I澳門黃金城官網appncrement(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 class 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資本損耗,而應用異步處置懲罰的測試結果全部處置懲罰歷程中都維持澳門黃金城官網app平穩使有環境.當然同時要面對便是低落了一些處置懲罰量和在延時上高點,但這些都可以經由過程設置調整線程來達到一個更好的結果.

總結

從測試結果可以看到異步httphandler加行列步隊節制在某些場可以很好的節制線程的處置懲罰前進系統的穩定性和處置懲罰效能,更緊張的一點是可以經由過程設置設置設備擺設擺設httphandler對現有的aspx進行異步哀求處置懲罰,當然在設置設置設備擺設擺設的時刻我們沒有需要針對所有aspx,只必要針對某些存IO操作而并發量又比擬較較高的aspx即可.

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

建体彩网
极速快乐十分开奖结果 广西十一选五 澳洲幸运5网站 湖南幸运赛车网上买 1818彩票官网 大发快三大小单双口诀 广西快3技巧 云南11选5彩票开奖 真钱手机斗地主 p3开机号