ASP.NET本质论阅读----线程与异步
线程
概要:操作系统通过线程对程序的执行进行管理
线程的数据结构:1.线程的核心对象(包含线程的当前寄存器状态),调用线程时-寄存器状态被加载到CPU中。
2.线程环境块TEB:一块用户模式下的内存
3.用户模式的堆栈:用户程序的局部变量和参数的存储
4.内核模式的堆栈:用于访问操作系统时的堆栈

线程分类:前台线程与后台线程。pS:所有前台线程终止,程序终止。
线程执行任务分类:工作者线程和I/O线程
工作者线程:计算密集的任务,CPU与线程资源充分利用
I/O线程:CPU可以不必参与处理过程
线程池
线程的创建与启动
由于线程用来表示代码的执行,所以需要通过委托进行,常见的3种线程委托
1.ThreadStart委托
public delegate void ThreadStart();
2.ParameterizedThreadStart委托
public delegate void ParameterizedThreadStart(Object obj)
3.TimerCallback委托
Timer类实现
public Timer(TimerCallback //时间到时执行的委托
,State //传递的参数
,DueTime //创建到第一次执行的时差
,Period //时间间隔
)
线程的状态 System.Thread.ThreadState

线程上下文获取线程数据 ExecutionContext
异步编程模式APM

为了支持APM模式处理,.NET中对于消耗时间较长的操作,提供了BEGIN和END的方法,当调用Begin,启动异步线程第一步,同时将会保存第三步处理的回调方法,第三部操作将会在线程池的I/O线程上执行。
例子:流的读取操作
1.同步
public override int Read(byte[] array ,int offset, int count);
2.异步,第一步和第三步操作如下
public override IAsyncResult BeginRead(
byte[] array
,int offset
,int numBytes
,AsyncCallback userCallback
,object stateObject)
userCallback:异步调用完成后,系统需要调用的回调方法
stateObject:传递给回调方法的用户自定义的参数对象,一般来说,这个对象是使用异步操作的对象,用来完成结束操作。
public override int EndRead( IAsyncResult syncResult);
FileStream fs= new FileStream(path,open); IAsyncResult result= fs.BeginRead(buffer,,,delegate(IAsyncResult ar)
{
int length= fs.EndRead(ar);},fs);
基于事件的异步编程模式EPM
支持EPM的类将有一个或多个后缀为Async的方法,同时还会有相应的名为Completed后缀的事件
Async方法启动异步处理,而Completed事件则通过事件来宣告异步处理的完成
无论处理完成、出现异常、终止异步处理,都必须调用Completed处理程序
例子:WebClient发送一个请求 OpenReadAsync
public void OpenReadAsync(Uri address)
public event OpenReadCompletedEventHandler OpenReadCompleted
处理该事件
public static void OpenReadCallback2(Object sender,OpenReadCompletedEventArgs e)
{
stream reply=null;
streamReader s=null;
try
{ reply=(stream)e.Result;
s=new StreamReader(reply);
Console.WriteLine(s.ReadToEnd());
}
异步线程的状态和同步问题
public interface IAsyncResult
{
object AsyncState{get;}
WaitHandle AsyncWatiHanle{get;}
bool CompletedSynchronously{get;}
bool IsCompleted{get;}
}
处理管道中的异步问题

将线程从等待中解放出来
在启动线程操作时,将结束异步操作的第三部方法保存起来,在第一步之后,立即结束第一个线程,第二部等待处理完成后,取出保存的第三部处理方法,重新获取一个线程执行第三部,完成后,继续线程的原来的后续步骤。
NextStep类
public NextStep(EndEventHandler handler){
this._endHandler=handler;
}
public void AsyncCallback(IAsyncResult ar)
{ this._endHandler(ar);
} ReadFile类
封装 IAsyncReault BeginReadFile(Object sender,EvnetArgs e,
AsyncCallback cb, Object extraData);
void EndReadFile(IAsyncResult ar); StepDemo
封装this._beginHandler和this._endHandler
public void DoAsyncBeginWork()
{
NextSetp step=new (this._endhandler);
this.beginHandler(this, , step.AsyncCallback,null);
} 调用
StepDemo demo=new StepDemo();
ReadFile rf=new ReadFile();
demo.AddDoWork(rf.BeginHandler,rf.EndHandler);
demo.DoAsyncBeiginWork();
线程池
public static class ThreadPool
.net在每一个线程中维护一个应用程序分享的线程池,线程池提供队列,可以使用少量的线程完成多数线程的任务
线程池工作原理:
1.线程池的线程分为:计算密集的工作者线程 、 I/O线程
2.线程池的线程从相应的任务队列中获取相应的任务进行处理,完成后,继续从队列获取任务,如果没有,在等待一段时间后,线程将被销毁
加入工作者线程
1.public delegate void WaitCallback{object state}
2.public static void main(){
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));
static void ThreadProc(object stateInfo){};
加入I/O线程
调用Begin开头的方法,就是将线程排入线程池的I/O任务队列
HttpApplication中的异步线程
服务器接收一个请求时,httpRuntime将从HttpApplication池中获取一个HttpApplication对象处理请求,请求的处理过程被排入线程池中。
ASP.NET本质论阅读----线程与异步的更多相关文章
- ASP.NET线程与异步
什么是线程? 线程简单来说就是一种数据结构,用来管理这个程序的执行状态,其中包括 1.线程核心对象->寄存器的状态 2.线程环境块,是一块用户模式下的内存,包含线程的异常处理链的头部.线程的局部 ...
- 七天学会ASP.NET MVC (六)——线程问题、异常处理、自定义URL
本节又带了一些常用的,却很难理解的问题,本节从文件上传功能的实现引出了线程使用,介绍了线程饥饿的解决方法,异常处理方法,了解RouteTable自定义路径 . 系列文章 七天学会ASP.NET MVC ...
- ASP.NET sync over async(异步中同步,什么鬼?)
async/await 是我们在 ASP.NET 应用程序中,写异步代码最常用的两个关键字,使用它俩,我们不需要考虑太多背后的东西,比如异步的原理等等,如果你的 ASP.NET 应用程序是异步到底的, ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序使用异步及存储过程
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第九篇:为ASP.NET MVC应用程序 ...
- ASP.NET MVC应用程序使用异步及存储过程
ASP.NET MVC应用程序使用异步及存储过程 是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译 ...
- ASP.NET MVC 学习笔记-6.异步控制器
1) 异步控制器的由来 对于IIS,它维护了一个.NET线程池来处理客户端请求,这个线程池称为工作线程池,其中的线程称为工作线程.当IIS接收到一个请求时,需要从工作线程池中唤醒一个工 ...
- ASP.NET MVC什么时候使用异步Action
在没有使用异步Action之前,在Action内,比如有如下的写法: public ActionResult Index() CustomerHelper cHelper = new Customer ...
- 【转载】Javascript里面的线程和异步
JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序. 参考这篇文章 http://www.ruanyifeng.com/blog/2012/1 ...
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...
随机推荐
- Java中join的使用
join用于主线程等待子线程运行完毕它的run方法,再继续执行下面的代码. join() = join(0),主线程无限等待子线程执行完毕. join(n milliseconds),主线程只等待n毫 ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(九)-- 单元测试
本篇将结合这个系列的例子的基础上演示在Asp.Net Core里如何使用XUnit结合Moq进行单元测试,同时对整个项目进行集成测试. 第一部分.XUnit 修改 Project.json 文件内容, ...
- Windows下安装Elasticsearch
1.下载elasticsearch-1.6.0 .jdk-7u67-windows-x64.exe 1.6.0必须用jdk1.7才能运行 2.配置JAVA_HOME:C:\Program Files\ ...
- div左右布局
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <!DOCTYPE html> <html> <head> ...
- php excel (转)
首先到phpexcel官网上下载最新的phpexcel类,下周解压缩一个classes文件夹,里面包含了PHPExcel.php和 PHPExcel的文件夹,这个类文件和文件夹是我们需要的,把clas ...
- Linux忘记密码的解救方法
Linux版本 centos5.6 64bit 环境 vmware 忘记密码 解决方法1: 重启系统, 一.重启系统,在系统引导前按任意键进入菜单.如图:GRUB: 在引导装载程序菜单上,用上下方向键 ...
- hadoop2—namenode—HA原理详解
在hadoop1中NameNode存在一个单点故障问题,也就是说如果NameNode所在的机器发生故障,那么整个集群就将不可用(hadoop1中有个SecorndaryNameNode,但是它并不是N ...
- nandflash操作详解
1.nandflash就是嵌入式系统的硬盘 2.分类(1)MLC:存储单元格存储两位,慢,偏移,寿命短,容量大(2)SLC:存储一位.快,寿命长,容量小,昂贵 3访问:(1)独立编址,有专用的控制器, ...
- Ruby使用gets的错误:gets得到的有'\n',需要使用chomp去掉
gets方法得到的字符串包含一个“\n”回车符,所以我们需要继续使用chomp方法把"\n"回车符去掉
- Excle中LOOKUP经典用法
在Excle中我们经常会遇到需要求根据某个区间的判断然后获取到对应的结果,下面是一个具体的实现例子: 例如: 现在需要实现,当输入0到25以内的任何数字时,会自动获取相应的英文字母 =IFERROR( ...