ASP.NET线程与异步

   什么是线程?

  线程简单来说就是一种数据结构,用来管理这个程序的执行状态,其中包括

    1.线程核心对象->寄存器的状态

    2.线程环境块,是一块用户模式下的内存,包含线程的异常处理链的头部.线程的局部存储数据也存在这里

    3.用户模式的堆栈,用户程序的局部变量和参数传递所使用的堆栈,默认情况下Windows将会分配1M的控件用于用户模式的堆栈

    4.内核模式堆栈,用于访问操作系统时使用的堆栈

加入线程池

  >工作者线程

    ThreadPool.QueueUserWorkItem();
  >I/O线程
  
  Beginxxx();
ASP.NET中的线程池设置
  1.Machine.config文件的processModel
  2.httpRuntime配置结点
    minFreeThreads 最少自由线程,默认为8,建议88
    minLocalRequestFreeThreads 默认为4,建议76
    appRequestQueueLimit 请求限制 默认5000

获取步骤:

        Configuration conf= WebConfigurationManager.OpenWebConfiguration(null);
        ProcessModelSection pc = conf.GetSection("system.web/processModel") as ProcessModelSection;
       HttpModulesSection hs= conf.GetSection("system.web/httpRuntime")as HttpModulesSection;


异步处理程序
  1.需要实现IHttpAsyncHandler接口
异步页面访问Web服务的三种方式
  1.使用AddOnPreRenderCompleteAsync 的方式
  2.使用PageAsyncTask 完成异步
  3.通过Web服务的异步事件进行处理

自定义异步:

  首先生成回调函数EndCallBack

  public  class EndCallBack
    {
        private EndEventHandler _nextHandler;
        public EndCallBack(EndEventHandler ed)
        {
            this._nextHandler = ed;
        }
        public void AsyncCallBack(IAsyncResult ia)
        {
            Console.WriteLine("进到_EndCallBack的AsyncCallBack方法中...........");
            _nextHandler(ia);
            Console.WriteLine("方法执行完毕...........OVER");
        }
    }

  生成自定义IAsyncResult

  public class MyIAsyncHandler : IAsyncResult
    {
        private AsyncCallback _callback;
        public MyIAsyncHandler(AsyncCallback callback)
        {
            this._callback = callback;
        }
        public void IsComple()
        {
            IsCompleted = true;
            if (this._callback!=null)
            {
                _callback(this);
            }
        }
        public object AsyncState
        {
            get;
            set;
        }

        public System.Threading.WaitHandle AsyncWaitHandle
        {
            get;
            set;
        }

        public bool CompletedSynchronously
        {
            get { return false; }
        }

        public bool IsCompleted
        {
            get;
           private set;
        }
    }

  自定义开始异步和结束异步的方法

   public class DoSomting
    {
       public IAsyncResult BeginAsync(Object sender,EventArgs e,AsyncCallback ca,Object exData)
       {
           Console.WriteLine("开始比较耗时的任务......................");
           //FileStream fs = new FileStream("EP01.mp4",FileMode.Open,FileAccess.Read);
           MyIAsyncHandler i = new MyIAsyncHandler(ca);
           ThreadPool.QueueUserWorkItem(d => {

               Thread.Sleep(3000);
               i.IsComple();
           });//把复杂的事情交给线程池去做
           return i;
       }
       public void EndAsync(IAsyncResult ia)
       {
           Console.WriteLine("EndAsync方法被执行拉...............");
       }
    }

  开始调用方法

 public class MySet
    {
       private BeginEventHandler _begineventhandler;
       private EndEventHandler _endeventhandler;
       public MySet(BeginEventHandler b,EndEventHandler e)
       {
           this._begineventhandler = b;
           this._endeventhandler = e;
       }
       public void DoAsyncWork()
       {
           DoBeginWork();

       }
       private void DoBeginWork()
       {
           Console.WriteLine("开始执行管道  开始部分工作");
           if (this._begineventhandler!=null)
           {
               EndCallBack e = new EndCallBack(this._endeventhandler);
               this._begineventhandler(this, EventArgs.Empty, e.AsyncCallBack, null);
           }
           Console.WriteLine("注意此时管道的开始部分已经结束............");
       }
    }

  最后开始执行

        static void Main(string[] args)
        {
            DoSomting d = new DoSomting();
            MySet m = new MySet(d.BeginAsync,d.EndAsync);
            m.DoAsyncWork();
            Console.Read();
        }

 

posted @ 2016-12-06 21:14  夏风微凉  阅读(243)  评论(0)    收藏  举报