什么是线程?
线程简单来说就是一种数据结构,用来管理这个程序的执行状态,其中包括
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(); }