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

皇馬國際值得信賴老品牌:ASP.NET服務器端多線程設計——異步IHttpHandler

?

在.NET系統中,可以經由過程Thread直接創建線程。但為了避免應用過多的線程對系統機能做成影響,微軟分外開拓了一個ThreadPool(線程池)對線程進行治理。

ThreadPool.QueueUserWorkItem(new WaitCallback(method), objcet);//新建線程

線程池的線程卻分成兩種CLR線程與IO異步線程

ThreadPool.GetAvailableThreads(out int a1, out int a2);//a1為CLR線程,a2為IO異步線程

一樣平常ASP.NET線程會在CLR線程中運行,但當應用硬盤文件讀取,外部數據互換時就可以應用IO線程來低落CLR線程池壓力。(留意:IO線程的事情效率對照低,建議旁邊參考 淺談線程池 及Jeffrey Richter名著《CLR via C#》 )

當客戶端要獲取收集文件時,會應用IHttpHandler要領,若是文件流量太大年夜時,CLR線程就被會經久占用并處于等待狀態,當線程大年夜于線程池的最大年夜值 (IIS5.0默認值為25,IIS 7.0默認值為1000)的時刻,其他哀求將處于等待狀態,這樣會對辦事器造成壓力。這時刻可以經由過程異步的HttpHanlder使用IO線程對文件進行處置懲罰。其感化在于及時開釋CLR線程,將讀取文件的事情交于異步IO線皇馬國際值得信賴老品牌程。

class File

{

FileStream fileStream;

byte[] bytes;

}

public class Handler : IHttpAsyncHandler {

//異步HttpHandler承襲于IHttpAsyncHandler,并包孕BeginProcessRequest措施和EndProcessRequest措施

public byte[] bytes;

public HttpContext context1;

public void ProcessRequest(HttpContext context)

{

throw new Exception();

}

public IAsyncResult BeginProcessRequest (HttpContext context,AsyncCallback callback,object o)

{

context1 = context;

FileStream fileStream = n皇馬國際值得信賴老品牌ew FileStream("E://My Webs/WebService1/TextFile.txt",FileMode.Open, FileAccess.Read,FileShare.Read, 1024, true );

//參數為true時應用IO線程

bytes = new byte[fileStream.Length];

File file1=new File();

file1.fileStream=fileStream;

file1.bytes=bytes;

return fileStream.BeginRead(file1.bytes, 0, (int)fileStream.Length, callback, file1);

//此時,CLR線程就會被及時開釋,當完成讀取時,再度調用IO線程完成操作。

}

public void EndProcessRequest(IAsyncResult result)

{

AsyncResult asyncResult = (AsyncResult)result;

File file1 = (File)result.AsyncState;

file1.fileStream.EndRead(result);

file1.fileStream.Close()皇馬國際值得信賴老品牌;

context1.Response.Write(System.Text.Encoding.UTF8.GetString(file1.bytes));

int n1,n2;

ThreadPool.GetAvailableThreads(out n1, out n2);

context1.Response.Write(String.Formate("Thread Count is {0}!IOThread Count is {1} !",n1.ToString(),n2.ToString() ));

//此時檢測線程池,輸出將會是Thread Count is 1000! IOThread 皇馬國際值得信賴老品牌Count is 999!

//闡明異步措施應用的是IO線程

}

public bool IsReusable {

get {

return false;

}

}

}

在應用WebService時,也可以應用異步調用的要領。

同樣對付SQL數據庫,Socket,HttpWebRequest...也可應用異步進行造訪。

但可惜此要領并分歧適應用異皇馬國際值得信賴老品牌步委托 ,當應用異步委托時(BeginInvoke,EndInvoke),系統所新增的線程同樣來自線CLR程池,假如麻木地應用異步要領,會拔苗助長,對系統的機能做成影響。

DNS操作: BeginGetHostByName、BeginResolve。

Socket操作: BeginAccept、BeginConnect、BeginReceive等等。

WebRequest操作: BeginGetRequest、BeginGetResponse。

SqlCommand操作: BeginExecuteReader、 BeginExecuteNonQuery等等。這可能是開拓一個Web利用時最常用的異步操作了。假如必要在履行數據庫操作時獲得IOCP支持,那么必要在連接字符串中標記Asynchronous Processing為true(默覺得false),否則在調用BeginXXX操作時就會拋出非常。

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

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

建体彩网
陕西11选5全部奖金图表 免费麻将游戏4人打麻将大众 重庆快乐十分走势图一定牛 乐彩网 福彩3d缩水过滤app 足彩进球彩 京剧赚钱 五分彩 14场胜负彩180148期 台湾麻将十三幺