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,0,4096,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对象处理请求,请求的处理过程被排入线程池中。

时间: 2024-10-06 07:09:51

ASP.NET本质论阅读----线程与异步的相关文章

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

本节又带了一些常用的,却很难理解的问题,本节从文件上传功能的实现引出了线程使用,介绍了线程饥饿的解决方法,异常处理方法,了解RouteTable自定义路径 . 系列文章 七天学会ASP.NET MVC (一)--深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)--ASP.NET MVC 数据传递 七天学会ASP.NET MVC (三)--ASP.Net MVC 数据处理 七天学会ASP.NET MVC (四)--用户授权认证问题 七天学会ASP.NET MVC (五)--L

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

在没有使用异步Action之前,在Action内,比如有如下的写法: public ActionResult Index() { CustomerHelper cHelper = new CustomerHelper(); List<Customer> result = cHelper.GetCustomerData(); return View(result); } 以上,假设,GetCustomerData方法是调用第三方的服务,整个过程都是同步的,大致是: →请求来到Index这个Act

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

转自:http://www.cnblogs.com/xishuai/p/asp-net-sync-over-async.html async/await 是我们在 ASP.NET 应用程序中,写异步代码最常用的两个关键字,使用它俩,我们不需要考虑太多背后的东西,比如异步的原理等等,如果你的 ASP.NET 应用程序是异步到底的,包含数据库访问异步.网络访问异步.服务调用异步等等,那么恭喜你,你的应用程序是没问题的,但有一种情况是,你的应用程序代码比较老,是同步的,但现在你需要调用异步代码,这该怎

ASP.NET MVC如何正确运用异步编程技术

一.什么是同步和异步? 同步(英语:Synchronization),指对在一个系统中所发生的事件(event)之间进行协调,在时间上出现一致性与统一化的现象.说白了就是多个任务一个一个执行,同一时刻只有一个任务在执行. 异步(英语:Asynchronization),指的是让CPU暂时搁置当前请求的响应,处理下一个请求,当通过轮询或其他方式得到回调通知后,开始运行.多线程将异步操作放入另一线程中运行,通过轮询或回调方法得到完成通知,但是完成端口,由操作系统接管异步操作的调度,通过硬件中断,在完

[.NET 4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库

此为文章备份,原文出处(我的网站)  [.NET 4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库 http://www.dotblogs.com.tw/mis2000lab/archive/2014/05/08/ado.net4.5_async_await_20140508.aspx 以前的ADO.NET也能作  "异步"(Async,大陆说法:异步),可以参考 KKBruce 2009/11月的文章: SQLCOMMAND的异步行程

带你一步步实现线程池异步回调

转载请注明出处 作者:晓渡文章地址:https://greatestrabit.github.io/2016/03/29/callback/ 1.字面意义上的回调 字面意思上理解回调,就是A调用B,B回过头来再调用A,即是回调.既然是这样,当然就要求A中有B,B中有A.如下: class A { /**  * 提出问题  * @author [email protected]  * @param b  * @param question  */ public void ask(final B b

Android-多线程和异步概述及面试题

Android-多线程和异步概述 一 Java中的多线程 Runable Thread ThreadPoolExector ScheduleExector 线程同步 Synchronized同步 Lock锁 Semaphore信号量 二 Android中使用多线程 1,为何使用多线程 IO操作:文件,网络,数据库 复杂运算 定时操作 对于耗时操作,应该放到非主线程中运行,从而避免阻塞主线程 为了保证良好的用户体验, 建议对超过50ms(1000ms / 50ms = 20FPS为人眼看到的流畅的

Android - UI线程和异步(AsyncTask)线程

UI线程和异步(AsyncTask)线程 本文地址: http://blog.csdn.net/caroline_wendy Android的UI线程,也称作单线程,单线程应用串行运行所有命令,每个调用都是阻塞的. ANR(Application Not Responding)对话框,当应用程序一定时间(通常是5秒)无响应时,Android系统将会提示终止它. 主UI在前台运行,额外的UI(如联网)在后台运行:可以使用AsyncTask类,执行多线程. AsyncTask类主要有三个操作: do

创建线程之异步委托

首先定义一个runtaketime委托: public delegate int runtaketime(int data,int ms); 定义一个静态的方法,参数,返回类型和定义的委托一样 static public int taketime(int data, int ms) { Console.WriteLine("time begin!"); Thread.Sleep(ms); Console.WriteLine("time end!"); return