1.博客园文章:线程阶段性总结——APM,ThreadPool,Task,TaskScheduler ,CancellationTokenSource
http://www.cnblogs.com/xiashengwang/archive/2012/08/18/2645588.html
2.博客园文章:C# 线程知识--使用Task执行异步操作
http://www.cnblogs.com/pengstone/archive/2012/12/23/2830238.html
3.博客园文章: Metro Style App 异步-简洁而不简单的异步
http://www.cnblogs.com/trigged/archive/2012/03/09/2388182.html
4.博客园文章:异步编程中的最佳做法
http://www.cnblogs.com/LittleFeiHu/p/4604179.html
5.博客园文章:async And await异步编程活用基础
http://www.cnblogs.com/x-xk/archive/2013/06/05/3118005.html
注意事项:
1. 有async 则必须有await ,异步方法的返回类型必须是Task<T>
2. 被async 标记的方法一定是异步方法,异步方法的返回值必须为void、Task、Task<T>
3. 没被async标记修饰,但返回值为Task、Task<T>的方法也是异步方法
4. await 关键字后的方法一定是异步方法
5. 方法中如果使用了await关键字,那么该方法也应该被async关键字修饰
6. 使用await(await GetResult(100))关键字,会使程序等待返回结果后再继续向下执行代码,但不会阻塞UI线程
参考代码:
static CancellationTokenSource cancellation = new CancellationTokenSource(3000); private static void CanceltionDemo() { Task<int> task = new Task<int>(() => { return GetNumber(500); }, cancellation.Token); task.ContinueWith(t => { if (t.IsFaulted == false && t.IsCanceled == false) { int data = t.Result; Console.WriteLine(data); } else { Console.WriteLine("error"); } }); cancellation.Token.Register(() => { Console.WriteLine("task is be canceled..."); }); task.Start(); } private static int GetNumber(int number) { if (cancellation.IsCancellationRequested) { cancellation.Token.ThrowIfCancellationRequested(); } if (number == 1 || number == 2) { return 1; } return GetNumber(number - 2) + GetNumber(number - 1); } private static void ContinueWithDemo() { var result = DoWorkAsync().ContinueWith(task => { Console.WriteLine(task.Result); }, TaskContinuationOptions.None); } private static void ResultPropertyDemo() { var result = DoWorkAsync().Result; Console.WriteLine(result); } static Task<string> DoWorkAsync() { return Task<string>.Factory.StartNew(() => { throw new Exception("error"); Thread.Sleep(3000); return "Hello world..."; }); }
优秀的教材:
1. Pro ASP.NET WEB API