您现在的位置:澳门网上真人龙虎 > 菲律宾申博官方网址 > 真钱金花博彩 true ); bytes = new byte[fileStream.Length]; File fil

真钱金花博彩 true ); bytes = new byte[fileStream.Length]; File fil

2019-08-12 22:10

正在.NET系统中,能够通过Thread直接创建线程。但为了预防运用过多的线程对系统机能做成影响,微软出格开发了一个ThreadPool(CLR线程池)对线程举行治理。

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

CLR线程池的线程却分成两种:工作家线扯蓦IO线程
ThreadPool.GetAvailableThreads(out int a1, out int a2);//a1为工作家线程,a2为IO线程

普通ASP.NET的页面恳求会正在工作家线程中运行,但当运用硬盘文件读取,表部数据交换时就能够运用IO线程来低落工作家线程的压力。(当心:若是读取幼型文件时异步运用IO线程,工作效率可以比单线程操作还要低,倡议左右参考Jeffrey Richter名著《CLR via C#》

当客户端要获取网络文件时,普通会运用IHttpHandler方式,如果文件流量太大时,CLR线程池的工作家线程就被会持久占用并处于期待状态,当线程大于线程池的最大值 (IIS5.0默认值为25*CPU数,IIS 7.0默认值为250*CPU数)的时分,其他恳求将处于期待状态,这样会对办事器酿成压力。这时分能够通过异步的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 IAsyncResultBeginProcessRequest (HttpContext context,AsyncCallback callback,object o)

   {    
       context1 = context;

       //运用异步I/O线程时当心用下面方式成立FileStream对象,澳门网上真人龙虎,并把末了的参数userAsync设置为true
       //若文件巨藐幼于缓冲值1024,那文件将一次性读取,澳门网上真人龙虎,回调时依然会运用CLR线程中池的工作家线程
       FileStream fileStream = new FileStream("E://My Webs/WebService1/TextFile.txt",

                                            FileMode.Open,FileAccess.Read,FileShare.Read, 1024, true );
       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)
   {

       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("WorkerThreads Count is {0}! ”+

                                      “ IOThreads Count is  {1} !",n1.ToString(),n2.ToString() ));

       //此时检测线程池,输出将会是WorkerThreads Count is 1000! IOThreads Count is 999!

       //注明异步步骤运用的是IO线程
   }

 

   public bool IsReusable {
       get {
           return false;
       }
   }

}

正在运用WebService时,也能够运用异步挪用的方式。

同样关于SQL数据库,太阳城真人真钱网址,Socket,HttpWebRequest...也可运用异步举行接见。

DNS操作 BeginGetHostByName、BeginResolve。

Socket操作 BeginAccept、BeginConnect、BeginReceive等等。

WebRequest操作 BeginGetRequest、BeginGetResponse。