线程

概要:操作系统通过线程对程序的执行进行管理

线程的数据结构: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本质论阅读----线程与异步的更多相关文章

  1. ASP.NET线程与异步

    什么是线程? 线程简单来说就是一种数据结构,用来管理这个程序的执行状态,其中包括 1.线程核心对象->寄存器的状态 2.线程环境块,是一块用户模式下的内存,包含线程的异常处理链的头部.线程的局部 ...

  2. 七天学会ASP.NET MVC (六)——线程问题、异常处理、自定义URL

    本节又带了一些常用的,却很难理解的问题,本节从文件上传功能的实现引出了线程使用,介绍了线程饥饿的解决方法,异常处理方法,了解RouteTable自定义路径 . 系列文章 七天学会ASP.NET MVC ...

  3. ASP.NET sync over async(异步中同步,什么鬼?)

    async/await 是我们在 ASP.NET 应用程序中,写异步代码最常用的两个关键字,使用它俩,我们不需要考虑太多背后的东西,比如异步的原理等等,如果你的 ASP.NET 应用程序是异步到底的, ...

  4. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序使用异步及存储过程

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第九篇:为ASP.NET MVC应用程序 ...

  5. ASP.NET MVC应用程序使用异步及存储过程

    ASP.NET MVC应用程序使用异步及存储过程 是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译 ...

  6. ASP.NET MVC 学习笔记-6.异步控制器

    1)         异步控制器的由来 对于IIS,它维护了一个.NET线程池来处理客户端请求,这个线程池称为工作线程池,其中的线程称为工作线程.当IIS接收到一个请求时,需要从工作线程池中唤醒一个工 ...

  7. ASP.NET MVC什么时候使用异步Action

    在没有使用异步Action之前,在Action内,比如有如下的写法: public ActionResult Index() CustomerHelper cHelper = new Customer ...

  8. 【转载】Javascript里面的线程和异步

    JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序. 参考这篇文章 http://www.ruanyifeng.com/blog/2012/1 ...

  9. 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 ...

随机推荐

  1. MySQL的20条基本优化 加参考资料

    mysql的性能优化包罗甚广:索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存)等等.这里的记录的优化技巧更适用于开发人员,都是从网络上收集和自己整理 ...

  2. C# 集合 — Hashtable 线程安全

    基础知识重要吗?真的很重要. 就在笔者与同事聊天中突然同事提出一个问题,让笔都有点乱了手脚(有点夸张),题目是这样的: 问:Hashtable 是线程安全的吗? 答:…… (沉默中,Yes Or No ...

  3. [视频]物联网应用-ARM mbed-来至MultiTech Systems的解决方案

    ARM公司面向物联网及可穿戴市场,近期可谓是动作频频,先是发布了专为物联网及可穿戴领域而生的Cortex-M7架构,接着又发布了mbed物联网操作系统.意图在物联网领域构筑一套坚不可摧的生态系统. 这 ...

  4. js 实现栈

    function Stack() { this.dataStore = []; this.top = 0; this.push=push; this.pop=pop; this.peek=peek; ...

  5. php分页代码实例

    $result = "<div class=\"page-num\"><ul class=\"fn-clear\">" ...

  6. sendBroadcast 无法接收

    项目中遇到已经sendbroadcast,但是在对应的BroadcastReceiver中却无法调用onReceiver 真是个纠结的问题.找了许久. 终于发现Intent中传递了一个参数(自定义类继 ...

  7. WCF 内存入口检查失败

    WCF 内存入口检查失败 Memory gates checking failed   异常信息:内存入口检查失败,因为可用内存(xxx 字节)少于总内存的 xx%.因此,该服务不可用于传入的请求.若 ...

  8. WPF中线性渐变画刷的一个小窍门

    最近被项目里面控件的设计搞的死去活来的,大部分的设计都会需要使用进度条的功能,因为UI形状的变态,使用ProgressBar不能满足需求,没办法就自己想办法实现进度显示.折腾的多了发现一个很不错的方法 ...

  9. ThinkPHP 3.2.2跨控制器调用方法

     所谓跨控制器调用,指的是在一个控制器中调用另一个控制器的某个方法.在ThinkPHP中有三种方式实现跨控制器调用: 直接实例化: A()函数实例化; R()函数实例化. (1)直接实例化  直接实例 ...

  10. Python sequence (序列)

    序列简介 sequence 是一组有序元素的组合 序列可以是多个元素,也可以一个元素都没有 序列有2种:tuple(定值表).List(表) D:\python\Python_Day>pytho ...