await和async是在C#5中引入,而且在.NetFramewor4.5以及.NetCore中进行了支持。主要是解决性能瓶颈,而且加强系统的响应能力。
html
以上demo详细的描述了使用await时程序的运行机制,须要注意的如下几点:c#
Task类的表示单个操做不会返回一个值,一般以异步方式执行Task对象是一种的中心思想基于任务的异步模式。首次引入.NET Framework 4 中。
Task能够经过如下几种方式开始执行:多线程
Task.Run(() => { Console.WriteLine("无返回值委托"); }); Task.Run<int>(() => { Console.WriteLine("带返回值委托"); return 1; }); Task t = new Task(() => { Console.WriteLine("声明一个Task能够后续经过t.run执行"); }); TaskFactory factory = new TaskFactory(); factory.StartNew<int>(() => { Console.WriteLine("经过TaskFactory执行"); return 1; }); Task t4 = new Task(() => { Console.WriteLine("同步执行"); }); // 同步执行 t4.RunSynchronously();
task的执行方式这里很少作介绍,下面主要说下Task的异常处理。app
.Net中异步方法由 async修饰符标记,一般包含一个或多个await表达式或语句。await表达式将await运算符应用于 Task 或Task
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
对于异步线程的执行结果,最多有三种状况async
task.Exception.InnerException.Message
using System; using System.Threading; using System.Threading.Tasks; public class Example { public static void Main() { // Create a cancellation token and cancel it. var source1 = new CancellationTokenSource(); var token1 = source1.Token; source1.Cancel(); // Create a cancellation token for later cancellation. var source2 = new CancellationTokenSource(); var token2 = source2.Token; // Create a series of tasks that will complete, be cancelled, // timeout, or throw an exception. Task[] tasks = new Task[12]; for (int i = 0; i < 12; i++) { switch (i % 4) { // Task should run to completion. case 0: tasks[i] = Task.Run(() => Thread.Sleep(2000)); break; // Task should be set to canceled state. case 1: tasks[i] = Task.Run( () => Thread.Sleep(2000), token1); break; case 2: // Task should throw an exception. tasks[i] = Task.Run( () => { throw new NotSupportedException(); } ); break; case 3: // Task should examine cancellation token. tasks[i] = Task.Run( () => { Thread.Sleep(2000); if (token2.IsCancellationRequested) token2.ThrowIfCancellationRequested(); Thread.Sleep(500); }, token2); break; } } Thread.Sleep(250); source2.Cancel(); try { Task.WaitAll(tasks); } catch (AggregateException ae) { Console.WriteLine("One or more exceptions occurred:"); foreach (var ex in ae.InnerExceptions) Console.WriteLine(" {0}: {1}", ex.GetType().Name, ex.Message); } Console.WriteLine("\nStatus of tasks:"); foreach (var t in tasks) { Console.WriteLine(" Task #{0}: {1}", t.Id, t.Status); if (t.Exception != null) { foreach (var ex in t.Exception.InnerExceptions) Console.WriteLine(" {0}: {1}", ex.GetType().Name, ex.Message); } } } } // The example displays output like the following: // One or more exceptions occurred: // TaskCanceledException: A task was canceled. // NotSupportedException: Specified method is not supported. // TaskCanceledException: A task was canceled. // TaskCanceledException: A task was canceled. // NotSupportedException: Specified method is not supported. // TaskCanceledException: A task was canceled. // TaskCanceledException: A task was canceled. // NotSupportedException: Specified method is not supported. // TaskCanceledException: A task was canceled. // // Status of tasks: // Task #13: RanToCompletion // Task #1: Canceled // Task #3: Faulted // NotSupportedException: Specified method is not supported. // Task #8: Canceled // Task #14: RanToCompletion // Task #4: Canceled // Task #6: Faulted // NotSupportedException: Specified method is not supported. // Task #7: Canceled // Task #15: RanToCompletion // Task #9: Canceled // Task #11: Faulted // NotSupportedException: Specified method is not supported. // Task #12: Canceled