快捷搜索:  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操作时就会抛出非常。

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

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