网上电玩城捕鱼

网上电玩城捕鱼

电玩城捕鱼送分捕鱼送分电玩城那么需 要在连接字符串中标记Asynchronous Processing为true(默认为

作者:apefpi 发布时间:2019-08-14 13:11

正在.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线程
   }