.Net 多线程 异步编程 Await、Async和Task
生活随笔
收集整理的这篇文章主要介绍了
.Net 多线程 异步编程 Await、Async和Task
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
await和async简介
await和async是在C#5中引入,并且在.NetFramewor4.5以及.NetCore中进行了支持。主要是解决性能瓶颈,并且增强系统的响应能力。
以上demo详细的描述了使用await时程序的运行机制,需要注意的以下几点:
- 第五步:执行完成后如果发现下一步还有await即设置了中断点,此时命令会直接跳出此方法即执行6,换句话说,await表达式执行时暂停并不构成方法退出,只会导致 finally 代码块不运行。
- 第七步:当执行当getStringTask返回结果(第七步)及await等待方法执行完成开始执行后续操作时(8)此时的线程已经和第四步执行的线程不同编号了,但是此时4所在线程上下文中的AsyncLocal变量会被复制到await返回后的线程上下文中。详细参照https://www.cnblogs.com/liyong-blackStone/p/10270526.html
- async 和 await 关键字不会创建其他线程。 因为异步方法不会在其自身线程上运行,因此它不需要多线程.
Task简介
Task类的表示单个操作不会返回一个值,通常以异步方式执行Task对象是一种的中心思想基于任务的异步模式。首次引入.NET Framework 4 中。
Task可以通过以下几种方式开始执行:
task的执行方式这里不多做介绍,下面主要说下Task的异常处理。
异步方法内部的异常处理
.Net中异步方法由 async修饰符标记,通常包含一个或多个await表达式或语句。await表达式将await运算符应用于 Task 或Task。由于在异步方法中通常会存在多个线程,而子线程中的异常信息不能自动的抛到主线程上,所以要想在主线程上获得子线程的异常信息,需要借助于返回的task这个对象。以下为Msdn给出的一段示例代码:
public async Task DoSomethingAsync() {Task<string> theTask = DelayAsync();try{string result = await theTask;Debug.WriteLine("Result: " + result);}catch (Exception ex){Debug.WriteLine("Exception Message: " + ex.Message);}Debug.WriteLine("Task IsCanceled: " + theTask.IsCanceled);Debug.WriteLine("Task IsFaulted: " + theTask.IsFaulted);if (theTask.Exception != null){Debug.WriteLine("Task Exception Message: "+ theTask.Exception.Message);Debug.WriteLine("Task Inner Exception Message: "+ theTask.Exception.InnerException.Message);} }private async Task<string> DelayAsync() {await Task.Delay(100);// Uncomment each of the following lines to// demonstrate exception handling.//throw new OperationCanceledException("canceled");//throw new Exception("Something happened.");return "Done"; }// Output when no exception is thrown in the awaited method: // Result: Done // Task IsCanceled: False // Task IsFaulted: False// Output when an Exception is thrown in the awaited method: // Exception Message: Something happened. // Task IsCanceled: False // Task IsFaulted: True // Task Exception Message: One or more errors occurred. // Task Inner Exception Message: Something happened.// Output when a OperationCanceledException or TaskCanceledException // is thrown in the awaited method: // Exception Message: canceled // Task IsCanceled: True // Task IsFaulted: False对于异步线程的执行结果,最多有三种情况
- 正常执行结束:可以通过IsCompletedSuccessfully 属性表示任务正常结束,并成功执行。特别说明:IsCompleted为true只能表示执行完成,当任务处于三种最终状态之一: RanToCompletion, Faulted,或Canceled。时他都为true
- 发生异常:发生异常时,可以通过返回的task对象中的IsFaulted属性判断,为true时表示发生异常,如果要获取具体的异常信息,可以通过以下以下方式获取
- 异步线程被取消:异步线程被取消时task中的IsCanceled属性会被设置为true
了解取消任务可以参考msdn示例:
转载于:https://www.cnblogs.com/liyong-blackStone/p/10276769.html
总结
以上是生活随笔为你收集整理的.Net 多线程 异步编程 Await、Async和Task的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: How does asp.net web
- 下一篇: 设计模式整理之简单工厂