What's 异步方法
语法分析:
(1)关键字:方法头使用async修改。
(2)要求:包含N(N>0)个await表达式,表示需要异步执行的任务。如果没有包含await表达式,就与普通方法无异了。
(3)返回类型:只能返回3种类型(void、Task、Task<T>)。
(4)参数:数量不限,但不能使用 out 和 ref 关键字。
(5)命名约定:方法后缀名应以 Async 结尾。
async/await 的具体使用。
1 namespace 异步 2 { 3 class Program 4 { 5 //创建计时器 6 private static readonly Stopwatch Watch = new Stopwatch(); 7 8 private static void Main(string[] args) 9 { 10 //启动计时器 11 Watch.Start(); 12 13 const string url1 = "http://www.cnblogs.com/"; 14 const string url2 = "http://www.cnblogs.com/liqingwen/"; 15 16 //两次调用 CountCharacters 方法(下载某网站内容,并统计字符的个数) 17 Task<int> t1 = CountCharacters(1, url1); 18 Task<int> t2 = CountCharacters(2, url2); 19 20 //三次调用 ExtraOperation 方法(主要是通过拼接字符串达到耗时操作) 21 for (var i = 0; i < 3; i++) 22 { 23 ExtraOperation(i + 1); 24 } 25 26 //控制台输出 27 Console.WriteLine("{0} 的字符个数: {1}", url1, t1.Result); 28 Console.WriteLine("{0} 的字符个数: {1}", url2, t2.Result); 29 30 Console.Read(); 31 } 32 33 /// <summary> 34 /// 统计字符个数 35 /// </summary> 36 /// <param name="id"></param> 37 /// <param name="address"></param> 38 /// <returns></returns> 39 private static async Task<int> CountCharacters(int id, string address) 40 { 41 var wc = new WebClient(); 42 Console.WriteLine("开始调用 id = {0}:{1} ms", id, Watch.ElapsedMilliseconds); 43 44 var result = await wc.DownloadStringTaskAsync(address); 45 46 Console.WriteLine("调用完成 id = {0}:{1} ms", id, Watch.ElapsedMilliseconds); 47 48 return result.Length; 49 } 50 51 /// <summary> 52 /// 额外操作 53 /// </summary> 54 /// <param name="id"></param> 55 private static void ExtraOperation(int id) 56 { 57 //这里是通过拼接字符串进行一些相对耗时的操作 58 var s = ""; 59 60 for (var i = 0; i < 6000; i++) 61 { 62 s += i; 63 } 64 65 Console.WriteLine("id = {0} 的 ExtraOperation 方法完成:{1} ms", id, Watch.ElapsedMilliseconds); 66 } 67 } 68 }