这个章节我个人感觉意义不大,使用现有的APM(异步编程模型)和EAP(基于时间的异步模型)就很够用了,针对WPF和WinForm其实还有一些专门用于UI更新的类。
但是出于完整性,还是将一下怎么使用.NET4的并行扩展,也就是一直在使用Task模型来处理异步问题。有一个特别好处是,当有大量并发的IO操作时会有更好的效果。
大量并发的IO操作的含义是类似如下

private List<Task<int>> tasks;
有一堆的task,其中的每一个task都是一个异步的IO操作。

APM->Task

而一个整和APM的task产生方法如下

Task<int> task =
    Task<int>.Factory.FromAsync(
    stream.BeginRead, stream.EndRead,
    data, 0, data.Length, null,
    TaskCreationOptions.None);
另外不需要调用task的Start方法


EAP->Task

使用TaskCompletionSource<TResult>可以将一个EAP操作表示为一个Task<TResult>
使用TaskCompletionSource的几个方法可以尝试将底层的Task转换到某个特定的状态
TrySetCanceled:task转换成TaskStatusCanceled
SetException:task转换成TaskStatusFaulted
TrySetResult:task转换成TaskStatusRanToCompletion
 
下面以WebClient.DownloadFileAsync为例,演示如何将一个EAP的操作处理成一个Task对象
var tcs = new TaskCompletionSource<string>();
 
var wc = new WebClient();
 
AsyncCompletedEventHandler handler  =
    (hSender, hE) =>
    {
        if (hE.Error != null)
        {
            tcs.TrySetException(hE.Error);
        }
        else if (hE.Cancelled)
        {
            tcs.TrySetCanceled();
        }
        else
        {
            tcs.TrySetResult(fileName);
        }
        wc.DownloadFileCompleted -= handler;
    };
 
wc.DownloadFileCompleted += handler;
 
try
{
    wc.DownloadFileAsync(address, fileName);
}
catch (Exception ex)
{
    wc.DownloadFileCompleted -= handler;
    tcs.TrySetException(ex);
}
 
Task task = tcs.Task;

UI的更新

不论是WPF还是WinForm,UI控件只能在UI线程进行操作。他们都有各自的多种方案。
而使用Task模型的方案是使用一个TaskScheduler.FromCurrentSynchronizationContext();获取一个TaskScheduler,使用TaskScheduler执行的Task就是在UI线程下的。
var uiScheduler =
    TaskScheduler.FromCurrentSynchronizationContext();
var builderTask = //...一个不修改UI的任务
builderTask.ContinueWith(
        (t) =>
        {
            //..在这里进行UI的更新
        }, uiScheduler);

 
 

《C#并行编程高级教程》第9章 异步编程模型 笔记的更多相关文章

  1. 【读书笔记】.Net并行编程高级教程(二)-- 任务并行

    前面一篇提到例子都是数据并行,但这并不是并行化的唯一形式,在.Net4之前,必须要创建多个线程或者线程池来利用多核技术.现在只需要使用新的Task实例就可以通过更简单的代码解决命令式任务并行问题. 1 ...

  2. 【读书笔记】.Net并行编程高级教程--Parallel

    一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控>这本书中也多次提到并发,不管是计算机 ...

  3. Net并行编程高级教程--Parallel

    Net并行编程高级教程--Parallel 一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控 ...

  4. Objective-C 基础教程第三章,面向对象编程基础知

    目录 Objective-C 基础教程第三章,面向对象编程基础知 0x00 前言 0x01 间接(indirection) 0x02 面向对象编程中使用间接 面向过程编程 面向对象编程 0x03 OC ...

  5. 《深入浅出Node.js》第4章 异步编程

    @by Ruth92(转载请注明出处) 第4章 异步编程 Node 能够迅速成功并流行起来的原因: V8 和 异步 I/O 在性能上带来的提升: 前后端 JavaScript 编程风格一致 一.函数式 ...

  6. C#高级编程9-第13章 异步编程

    异步编程 1)异步编程的重要性 在C#5.0中提供了关键字:async和await 使用异步编程后台运行方法调用,程序的运行过程中就不会一直处于等待中.便于用户继续操作. 异步编程有3种模式:异步模式 ...

  7. 【读书笔记】C#高级编程 第十三章 异步编程

    (一)异步编程的重要性 使用异步编程,方法调用是在后台运行(通常在线程或任务的帮助下),并不会阻塞调用线程.有3中不同的异步编程模式:异步模式.基于事件的异步模式和新增加的基于任务的异步模式(TAP, ...

  8. 【读书笔记】《深入浅出nodejs》第四章 异步编程

    1. 异步编程的基础 -- 函数式编程 (1)高阶函数 -- 是可以把函数作为参数,或是将函数作为返回值的函数. (2)偏函数用法 -- 创建一个调用另外一个部分 -- 参数或变量已经预置的函数 -- ...

  9. C#异步编程(一)线程及异步编程基础

    最近试着做了几个.NET CORE的demo,看了些源码,感觉异步编程在Core里面已经成为主流,而对这块我还没有一个系统的总结,所以就出现了这篇文字,接下来几篇文章,我会总结下异步编程的思路,主要参 ...

随机推荐

  1. 【转】 Linux Core Dump 介绍

    ===============================================================  Linux core dump的祥细介绍和使用 =========== ...

  2. NodeJS包管理工具——npm入门

    如今每个语言体系中都有一个包管理工具,PHP的Composer,Ruby的gem,Python的pip,Java的Maven……当然还有Node.js的npm.有的人会奇怪为何要引入又一个新东西来让我 ...

  3. SQL Server数据库备份(异机)

    简单的远程异机备份数据库功能,通过这个存储过程,讲远程其他机器上的数据库备份到本地.其主要原理为: 1.通过XP_CMDSHELL执行Windows命令,将本机的共享目录映射为远程机器的网络驱动器. ...

  4. MVC视图引擎

    1.视图引擎:把视图解析成浏览器可执行的html代码 2.aspx视图: <%=表达式%>: <% C#代码段 %>: 3.razor视图: @(表达式):@ViewData[ ...

  5. js学习之函数声明与函数表达式区别[原创]

    作为一名js初学者,与大家分享下.Javascript中有函数声明提升的功能,会优先编译函数声明部分.比如, ff(); function ff(){ alert("hello world. ...

  6. python学习笔记11(函数二): 参数的传递、变量的作用域

    一.函数形参和实参的区别 形参全称是形式参数,在用def关键字定义函数时函数名后面括号里的变量称作为形式参数. 实参全称为实际参数,在调用函数时提供的值或者变量称作为实际参数. >>> ...

  7. Ext.Ajax.request()方法和FormPanel.getForm().submit()方法,都返回success()方法的差异

    我还是不发表到博客园首页吧,要不然还是要被取消,>_< 还是言归正传吧,关于Ext.Ajax.request()方法和FormPanel.getForm().submit()方法返回suc ...

  8. 3.9 spring-自定义标签解析

    到这里,我们已经完成了分析默认标签的解析与提取过程,或许设计的内容太多,我们忘了我们是冲哪个函数开始了的, 让我们再次回顾一下默认标签解析方法的起始方法. 入口如下: /** * Parse the ...

  9. C++11多线程教学(一)

    本篇教学代码可在GitHub获得:https://github.com/sol-prog/threads. 在之前的教学中,我展示了一些最新进的C++11语言内容: 1. 正则表达式(http://s ...

  10. 跨平台Unicode与UTF8互转代码

    参考来源:http://blog.csdn.net/flying8127/article/details/1598521 在原来原基础上,将代码整理,并加强安全性. 并按照WindowsAPI设计, ...