[待续]Async in C# 1
异步.异步是在.net .45里面提供的一个新的方法
它主要用在.三个方面
1.网络访问
2.磁盘访问
3.延迟很长时间的步骤
它主要有2个关键字
Async Await
Async 怎么工作
demo_1_下载一个html的2个方式来比较下
public static void Run()
{
//请注意 输出顺序..over之后才会输出DumpWebPageAsync 里面的page
var url = "http://abujj.me";
Console.WriteLine("1");
DumpWebPage(url);
Console.WriteLine("2");
DumpWebPageAsync(url);
Console.WriteLine("over");
Console.ReadKey();
}
// 正常下载
static void DumpWebPage(string uri)
{
WebClient webClient = new WebClient(); string page = webClient.DownloadString(uri);
Console.WriteLine(page.Substring(0,50));
}
// 异步下载
static async void DumpWebPageAsync(string uri)
{
WebClient webClient = new WebClient();
string page = await webClient.DownloadStringTaskAsync(uri);
Console.WriteLine(page.Substring(0, 50));
}
如果是异步方法.请后面加入Async后缀..来一标识下
DownloadStringTaskAsync 返回的是
public Task<string> DownloadStringTaskAsync(string address);
了解异步
下面代码是最简单的异步行为..没有用async .把一个回调函数作为参数的一个方法
void GetHostAddress(string hostName, Action<IPAddress> callback)
private void LookupHostName()
{
GetHostAddress("abujj.me", OnHostNameResolved);
}
private void OnHostNameResolved(IPAddress address)
{
// Do something ........
}
上面这个代码 还可以使用匿名方法或者 lamada表达式来实现这个回调
private void LookupHostName()
{
int aUsefulVariable = 3;
GetHostAddress("oreilly.com", address =>
{
// Do something ...
});
}
这样写有一个好处.就是在do something里面,可以使用外部的变量值
坏处就是,try_catch 抛异常 不容易控制..
Task(并行)
Task Parallel 库,net是4/0 引入的.async是c#5.0引入的. 里面包含了大量的task 代码.
然后用Task继续更改代码
private void LookupHostName()
{
Task<IPAddress[]> ipAddressesPromise = Dns.GetHostAddressesAsync("abujj.me");
ipAddressesPromise.ContinueWith(_ =>
{
IPAddress[] ipAddresses = ipAddressesPromise.Result;
// Do something ...
});
}
它返回一个Task<T> ,当使用ContinueWith 注册回调函数
ContinueWith 函数隶属Task . 意思就是创建一个Task.当完成时,异步执行的延续任务
写Async 代码
从文章开头的webClient就知道大概的async功能.
一步一步分析下这个代码
Task<string> DownloadStringTaskAsync(string address) 返回Task<string>
所以可以这么写
Task<string> myTask =webClient.DownloadStringTaskAsync(uri); // Do something here string page = await myTask;
当第一句话返回Task<string>其实并没有开始下载页面
只有当await的时候.才回去执行下载页面
这样.我们就可以开启多个并行任务.比如
//注册2个任务
Task<string> firstTask = webClient1.DownloadStringTaskAsync("abujj.me");
Task<string> secondTask = webClient2.DownloadStringTaskAsync("abujj.me");
//开始执行
string firstPage = await firstTask;
string secondPage = await secondTask
这有个问题.就是如果第一个执行await 抛异常..那么第二个永远不会await了
Async 返回类型
1.void
2.Task
3.Task<T> or T
async 关键字,出现在方法的声明上.就像 public关键字一样 .async 唯一的效果也就是已编译上体现
如果实行继承. async关键字毫无作用..比如
class BaseClass
{
public virtual async Task<int> AlexsMethod()
{
........
}
}
class SubClass : BaseClass
{
// 重载
public override Task<int> AlexsMethod()
{
...
}
}
重载后..少了async关键字.
声明接口..不能使用async 关键字 .原因就上上面一样..因为不需要.如果需要返回Task .那实现者可能会选择async
异步 匿名委托
Func<Task<int>> getNumberAsync = async delegate { return 3; };
async lamada :
Func<Task<string>> getWordAsync = async () => "hello";
await
int myNum = await AlexsMethodAsync(await myTask, await StuffAsync());
这个情况,自己可以试验下
什么情况不能用await
1. try-catch
try
{
page = await webClient.DownloadStringTaskAsync("abujj.me");
}
catch (WebException)
{
page = await webClient.DownloadStringTaskAsync("http://abujj.me");
}
当你抛异常的时候..
正确写法
bool failed = false;
try
{
page = await webClient.DownloadStringTaskAsync("http://abujj.me");
}
catch (WebException)
{
failed = true;
}
if (failed)
{
page = await webClient.DownloadStringTaskAsync("http://abujj.me");
}
基于Task_based的异步
前面说道Async用到了大量的Task
原文:http://abujj.me/archives/522
[待续]Async in C# 1的更多相关文章
- Await Async和Thread.waitAll想法?未完待续
[管理员]四九-李冰-修行者(2216529884) 2017/7/3 17:15:12 看着就可以了,这种东西是有使用场景的.并不是你用了就一定有提升的 [管理员]上海-xx科技(lovepoint ...
- Promise及Async/Await
一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪 ...
- async异步操作和同步上下文
第8章 哪个线程运行我的代码 看到社区里的朋友没有翻译完这本书,我接着对一下的章节进行翻译 像我之前说的,异步编程就是关于线程的.那就意味着我们需要理解在C#程序中哪个.NET线程什么时候运行我们的代 ...
- 异步Promise及Async/Await最完整入门攻略
一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪圈, ...
- 异步Promise及Async/Await可能最完整入门攻略
此文只介绍Async/Await与Promise基础知识与实际用到注意的问题,将通过很多代码实例进行说明,两个实例代码是setDelay和setDelaySecond. tips:本文系原创转自我的博 ...
- C#5.0 异步编程async/await用法
微软在发布VS2012的同时推出了C#5.0,其中包含了async和await 代码如下: class Program { private static readonly Stopwatch watc ...
- async/await运用-前端表单弹窗验证同步书写方式(React)
在前端项目中,我们经常会碰到这样的场景: 当前我们有一个表单需要填写,在完成表单填写后经过校验之后会弹出短信或者其他形式验证码,进行补充校验,然后一起提交给接口. 场景如下图: 当前为创建操作,编辑操 ...
- [C#] async 的三大返回类型
async 的三大返回类型 序 博主简单数了下自己发布过的异步文章,已经断断续续 8 篇了,这次我想以 async 的返回类型为例,单独谈谈. 异步方法具有三个可让开发人员选择的返回类型:Task&l ...
- async & await 的前世今生(Updated)
async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...
随机推荐
- 访问者模式(Visitor)
@@@模式定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下 定义作用于这些元素的新操作. @@@练习示例: 扩展客户管理的功能 @@@示例代码: \patter ...
- ImageView类简介
4.8 图片控件 本节将要介绍的是图片控件ImageView,首先对ImageView类进行简单介绍,然后通过一个案例来说明ImageView的用法. 4.8.1 ImageView类简介 Ima ...
- Android 仿PhotoShop调色板应用(一)概述
版权声明:本文为博主原创文章,未经博主允许不得转载. 在前面的系列我已经将Android中颜色渲染的原理及使用做了一个整体上概述. 现在开始根据一个比较复杂的实现进行具体的分析,这就是PhotoSho ...
- android 47 service绑定
如果一个service已经启动了,activity和service绑定了在解除邦定,则这个service不会销毁,因为这个service不是这个Activity创建的. service生命周期: Ac ...
- I/O体系结构和设备驱动程序
http://blog.csdn.net/kafeiflynn/article/category/789844
- 初步掌握Yarn的架构及原理
1.YARN 是什么? 从业界使用分布式系统的变化趋势和 hadoop 框架的长远发展来看,MapReduce的 JobTracker/TaskTracker 机制需要大规模的调整来修复它在可扩展性, ...
- 什么是php命名空间
php命名空间是在5.3版本后加入的,命名空间反过来就是空间命名,在这里的空间命名就像window下的文件夹命名,命名空间用关键字namespace来定义.在这里用文件夹举三个例子,比如相对于test ...
- MySQL - 复制数据表
假设现在有张数据表 users: CREATE TABLE users ( userid ) UNSIGNED NOT NULL, username ) UNIQUE, passwd ) ', PRI ...
- sql根据'/'截取最后的字符串
filpath字段值:/DataFile/UpLoad/Logo/NoPhoto.jpg select filpath,REVERSE((SUBSTRING(REVERSE(FilPath),0,CH ...
- 让ie6/7/8兼容css3的圆角阴影等特殊效果的方法 PIE1.0.0及placeholder在这些IE下生效的方法
PIE地址:http://css3pie.com/ 使用方法1: #login,#AnnouncementBox { border:3px solid #fff; -webkit-border-r ...