【C#】50.使用await操作连续的异步任务
来源:互联网 发布:2017最新网络神曲 编辑:程序博客网 时间:2024/05/22 06:44
本篇主要说明一下使用await处理连续异步任务后,程序的条理会变得较为清晰。
async static Task<string> GetInfoAsync(string name){Console.WriteLine("Task {0} started!", name);await Task.Delay(2000);if(name == "Async 2")throw new Exception("Boom!");return string.Format("Task {0} 运行在线程id为 {1}的线程. 是否是线程池线程: {2}",name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);}
async static Task AsynchronyWithAwait(){try{string result = await GetInfoAsync("Async 1");Console.WriteLine(result);result = await GetInfoAsync("Async 2");Console.WriteLine(result);}catch (Exception ex){Console.WriteLine(ex);}}
static void Main(string[] args){Task t = AsynchronyWithAwait();t.Wait();Console.Read();}
函数AsynchronyWithAwait中,两次使用了await,他们都将等待程序处理完毕后才会继续执行,因此两者执行的先后次序就是两者的上下文先后关系。在第二个await中的任务抛出了异常且被正确处理了,因此await也可以像正常使用try catch那样处理异常,无需将异常处理写在线程执行的函数体中。
然后我们来看下如何使用TPL方式(也就是ContinueWith)方式先后执行异步任务:
static Task AsynchronyWithTPL(){var containerTask = new Task(() => { Task<string> t = GetInfoAsync("TPL 1"); t.ContinueWith(task => {Console.WriteLine(t.Result);Task<string> t2 = GetInfoAsync("Async 2");t2.ContinueWith(innerTask => Console.WriteLine(innerTask.Result), TaskContinuationOptions.NotOnFaulted | TaskContinuationOptions.AttachedToParent);//不会被运行,因为NotOnFaulted,而t2是抛出异常的t2.ContinueWith(innerTask => Console.WriteLine(innerTask.Exception.InnerException), TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.AttachedToParent);//会被执行},TaskContinuationOptions.NotOnFaulted | TaskContinuationOptions.AttachedToParent); t.ContinueWith(task => Console.WriteLine(t.Exception.InnerException), TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.AttachedToParent);//不会被运行,因为t并没有发生异常;如果将TPL 1改为Async 2,那么这里将被运行而上面那些不会被运行。 }); containerTask.Start(); return containerTask;}
Task t = AsynchronyWithTPL();t.Wait();
0 0
- 【C#】50.使用await操作连续的异步任务
- C# 异步线程任务使用Task await
- 使用Promise和async-await实现的一个异步遍历+同步执行任务的实例
- 使用 Async 和 Await 的异步编程
- c# async、await的使用,异步方法
- async和await异步操作
- C#Winform里的async和await异步
- U3d 使用 异步 async await
- .NET中使用异步Async和Await的代价
- 异步爬虫: async/await 与 aiohttp的使用,以及例子
- ES7的Async/Await 异步
- ES7的Async/Await 异步
- [C#] 谈谈异步编程async await
- 异步任务AsyncTask的使用
- AsyncTask异步任务的使用
- 关于U3d 使用 async await异步语法
- [C#] .NET4.0中使用4.5中的 async/await 功能实现异步
- Android中异步任务的操作
- java基础--22.多线程
- 垃圾回收笑谈
- mongodb和redis 的常用指令和python远程连接
- 正则表达式基础入门
- PHP 导出excel 设置文本格式,数字前不去掉0
- 【C#】50.使用await操作连续的异步任务
- Spring学习01--IOC容器(简介,注入)
- 将value值转换为字符串方法以及原理详解
- 贪吃蛇,游戏,动画,JavaScript
- 编程珠玑-笔记1
- 设备驱动中的platform(kernel-4.7)
- C++ 虚函数表解析
- 聚焦核心竞争力:自建与外购
- 【HIbernate框架学习】:Hibernate对象继承关系映射(一)