• 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();
            }

    Hold on, everything is possible.
  • 相关阅读:
    python实现的列表操作
    python的静态方法
    python标准库学习2
    javascript继承原型继承的例子
    jQuery高亮显示文本中重要的关键字
    表格展开伸缩
    jQuery设计思想
    python标准库学习3
    python中的继承和抽象类的实现
    表格的变色问题
  • 原文地址:https://www.cnblogs.com/student-note/p/6139074.html
Copyright © 2020-2023  润新知