Task

.net 4.0为我们带来了Task的异步,我们有以下三种方法创建Task。

1,Task.Factory.StartNew,比较常用。

2,Task.Run,是.net 4.5中增加的。

3,Task.FromResult,如果结果是已计算,就可以使用这种方法来创建任务。

下面就以Task.Factory.StartNew继续来实现前面的那个例子,代码如下。

  1 /// <summary>
2 /// 使用Task,Task.Factory.StartNew,会创建新的线程
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void button4_Click(object sender, EventArgs e)
7 {
8 this.richTextBox1.Text = "正在处理请求...";
9
10 Task.Factory.StartNew(() =>
11 {
12 //下面这段代码可封装一下,一个没有返回值的方法
13 var url = this.textBox1.Text.Trim();
14 var request = HttpWebRequest.Create(url);
15 var response = request.GetResponse();
16 var stream = response.GetResponseStream();
17 using (StreamReader reader = new StreamReader(stream))
18 {
19 var content = reader.ReadToEnd();
20 this.richTextBox1.Text = content;
21 }
22 });
23 }

Task相较ThreadPool线程池使用更简单,而且支持线程的取消,完成和失败通知等交互性操作,而这些是ThreadPool所没有的。并且Task是可以有返回值的。

async/await

async&await是.net 4.5新增的特性,

下面还是使用async&await实现一遍之前的例子,代码如下。

  1 /// <summary>
2 /// 使用async/await
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private async void button5_Click(object sender, EventArgs e)
7 {
8 this.richTextBox1.Text = "正在处理请求...";
9
10 await DoWorkAsync();
11 }
12
13 public async Task DoWorkAsync()
14 {
15 var url = this.textBox1.Text.Trim();
16 var request = HttpWebRequest.Create(url);
17 var response = request.GetResponse();
18 var stream = response.GetResponseStream();
19 using (StreamReader reader = new StreamReader(stream))
20 {
21 var content = reader.ReadToEnd();
22 this.richTextBox1.Text = content;
23 }
24 }

有以下疑问:

1,看起来使用了async,UI线程还是会阻塞?

2,使用async并没有创建一个新的线程?

基于任务的异步模式(TAP)的更多相关文章

  1. 三、基于任务的异步模式(TAP),推荐使用

    一.引言 在上两个专题中我为大家介绍.NET 1.0中的APM和.NET 2.0中的EAP,在使用前面两种模式进行异步编程的时候,大家多多少少肯定会感觉到实现起来比较麻烦, 首先我个人觉得,当使用AP ...

  2. .NET 基于任务的异步模式(Task-based Asynchronous Pattern,TAP) async await

    本文内容 概述 编写异步方法 异步程序中的控制流 API 异步方法 线程 异步和等待 返回类型和参数 参考资料 下载 Demo 下载 Demo TPL 与 APM 和 EAP 结合(APM 和 EAP ...

  3. C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是TAP(Task-based Asynchronous Pattern, 基于任务的异步模式)

    学习书籍: <C#本质论> 1--C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是 ...

  4. 实践基于Task的异步模式

    Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...

  5. 实现基于Task的异步模式

    返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的方法都是异步方法,编 ...

  6. 基于Task的异步模式的定义

    返回该系列目录<基于Task的异步模式--全面介绍> 命名,参数和返回类型 在TAP(Task-based Asynchronous Pattern)中的异步操作的启动和完成是通过一个单独 ...

  7. 基于事件的异步模式(EAP)

    什么是EAP异步编程模式 EAP基于事件的异步模式是.net 2.0提出来的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步 ...

  8. 基于Task的异步模式--全面介绍

    今天是国庆长假第一天,也是今天十月的开始.每到这个时候都是看海的季节-一个看"人海"的季节.反正我是不想在这样一个尴尬期出去放松自己,于是不如在家写写博客,长点本领呢.今天就来给大 ...

  9. Event-based Asynchronous Pattern Overview基于事件的异步模式概览

    https://msdn.microsoft.com/zh-cn/library/wewwczdw(v=vs.110).aspx Applications that perform many task ...

随机推荐

  1. 前端面试-----JavaScript题

    用面试题,复习一下,js基础. 1.综合题 function Foo() { getName = function () { alert (1); }; return this; } Foo.getN ...

  2. Android 进程常驻----native保活5.0以上方案推演过程以及代码

    正文: 上一篇我们通过父子进程间建立双管道,来监听进程死掉,经过测试,无耗电问题,无内存消耗问题,可以在设置中force close下成功拉起,也可以在获取到root权限的360/cleanmaste ...

  3. ECNAScript6简介

    ECMAScript6.0(以下简称ES6)是JavaScript语言的下一代标砖,已经在2015年6月正式发布了,它的目标,是使得JavaScript语言可以用来编写负责的大型应用程序 ,成为企业级 ...

  4. ubuntu一些常用的命令

    1.docker里的ubuntu不知道密码,更新密码 sudo passwd 2.解压zip文件 unzip xx.zip 3.安装LAMP (1)sudo apt-get install apach ...

  5. d3.js读书笔记-1

    d3.js入门 d3入门 D3是一个强大的数据可视化工具,它是基于Javascript库的,用于创建数据可视化图形.在生成可视化图形的过程中,需要以下几步: 把数据加载到浏览器的内存空间: 把数据绑定 ...

  6. linux @后面的主机名如何修改

    @后面的为linux系统的主机名 临时修改方法:执行 hostname 主机名再执行 bash 永久修改方法:修改配置文件/etc/sysconfig/network修改参数HOSTNAME=主机名永 ...

  7. 扩展卡尔曼滤波(MRPT)

    EKF relies on a linearisation of the evolution and observation functions which are good approximatio ...

  8. SQL出错

    2016-12-26 15:43:02,870 DEBUG [org.springframework.test.context.support.DirtiesContextTestExecutionL ...

  9. DOCTYPE声明作用及用法详解

    一.浏览器呈现模式和doctype 有的网页是遵循标准而创作的,但也有很多不是.即使你不能创建遵循标准的网页,也希望浏览器根据标准来正确显示那些页.目前,大量网页充斥着大量非标准代码,它们仍能正常地工 ...

  10. shell编程之变量

    变量: 变量由字母.数字._ 组成,不能以数字开头 长度不能超过255个字符 在bash中,变量的默认类型是字符串类型 变量分类: 1.用户自定义变量:只在当前shell生效,是局部变量 定义方法: ...