IO操作的MDA(Direct memory access)模式:直接访问内存,是一种不经过CPU而直接进行内存数据存储的数据交换模式,几乎可以不损耗CPU的资源;
CLR所提供的异步编程模型就是充分利用硬件的DMA功能来释放CPU的压力;使用线程池进行管理,异步将工作移交给线程池中的某个工作线程来完成,直到异步完成,异步才会通过回调的方式通知线程池,让CLR响应异步完毕; 它是并发的一种形式,它采用 future 模式或回调(callback)机制,以避免产生不必要的线程。一个 future(或 promise)类型代表一些即将完成的操作。在 .NET 中,新版 future 类型有Task 和Task<TResult>。 异步编程模式------利用委托和线程池实现的模式APM 异步编程模型,Asynchronous Programming Model C#1.0 EAP 基于事件的异步编程模式,Event-based Asynchronous Pattern C#2.0 TAP 基于任务的异步编程模式,Task-based Asynchronous Pattern C#4.0 Async\await简化异步编程;任务并行库,Task Parallel Library C#5 APM 使用IAsyncResult设计模式的异步操作是通过名为 BeginXXX 和 EndXXX 的两个方法来实现,这两个方法分别指开始和结束异步操作。该模式允许用更少的CPU资源(线程)去做更多的操作,.NET Framework很多类也实现了该模式,同时我们也可以自定义类来实现该模式(也就是在自定义的类中实现返回类型为IAsyncResult接口的BeginXXX方法和接受IAsyncResult兼容类型作为唯一参数的EndXXX方法),另外委托类型也定义了BeginInvoke和EndInvoke方法。例如,FileStream类提供BeginRead和EndRead方法来从文件异步读取字节。这两个方法实现了 Read 方法的异步版本。 调用 BeginXXX 后,应用程序可以继续在调用线程上执行指令,同时异步操作在另一个线程上执行(如果有返回值还应调用 EndXXX结束异步操作,并向该方法传递BeginXXX 方法返回的IAsyncResult对象,获取操作的返回值)。 CompletedSynchronously属性值侧重与提示信息,而非操作 访问异步操作的结果,APM提供了四种方式: 1.在调用BeginXXX方法的线程上调用EndXXX方法来得到异步操作的结果;但是这种方式会阻塞调用线程,在知道操作完成之后调用线程才能继续运行。 2.循环查询IAsyncResult的IsComplete属性,操作完成后再调用EndXXX方法来获得操作返回的结果。 3.IAsyncResult的AsyncWaitHandle属性实现更加灵活的等待逻辑,调用该属性WaitOne()方法来使一个线程阻塞并等待操作完成;再调用EndXXX方法来获得操作的结果。WaitHandle.WaitOne()可以指定最长的等待时间,如超时返回false; 4. 在调用BeginXXX方法时提供AsyncCallback委托的实例作为参数,在异步操作完成后委托会自动调用(AsyncCallback对象)指定的方法。(首选方式)AsyncCallback委托仅能够调用符合特定模式的方法(只有一个参数IAsyncResult,且没有返回值);
|