玉祥平台客服-15087858732

标题: C#异步编程 [打印本页]

作者: Adam丶鱼    时间: 2020-6-25 18:33
标题: C#异步编程
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方法),另外委托类型也定义了BeginInvokeEndInvoke方法。例如,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,且没有返回值);


作者: Adam丶鱼    时间: 2020-6-25 18:34

作者: fteair    时间: 2020-6-28 14:37

作者: 张兴康    时间: 2020-6-30 14:14





欢迎光临 玉祥平台客服-15087858732 (http://bbs.delit.cn/) Powered by Discuz! X3.2