async和await
总结下博客园中看到的async和await
1 public static class TaskAsyncHelper 2 { 3 /// <summary> 4 /// 将一个方法function异步运行,在执行完毕时执行回调callback 5 /// </summary> 6 /// <param name="function">异步方法,该方法没有参数,返回类型必须是void</param> 7 /// <param name="callback">异步方法执行完毕时执行的回调方法,该方法没有参数,返回类型必须是void</param> 8 public static async void RunAsync(Action function, Action callback) 9 { 10 Func<Task> taskFunc = () => 11 { 12 return Task.Run(() => 13 { 14 function(); 15 }); 16 }; 17 await taskFunc(); 18 if (callback != null) 19 callback(); 20 } 21 22 /// <summary> 23 /// 将一个方法function异步运行,在执行完毕时执行回调callback 24 /// </summary> 25 /// <typeparam name="TResult">异步方法的返回类型</typeparam> 26 /// <param name="function">异步方法,该方法没有参数,返回类型必须是TResult</param> 27 /// <param name="callback">异步方法执行完毕时执行的回调方法,该方法参数为TResult,返回类型必须是void</param> 28 public static async void RunAsync<TResult>(Func<TResult> function, Action<TResult> callback) 29 { 30 Func<Task<TResult>> taskFunc = ()=> 31 { 32 return Task.Run(()=> 33 { 34 return function(); 35 }); 36 }; 37 TResult rlt = await taskFunc(); 38 if(callback != null) 39 callback(rlt); 40 } 41 }
1 public class MyClass 2 { 3 public MyClass() 4 { 5 DisplayValue(); //这里不会阻塞 6 System.Diagnostics.Debug.WriteLine("MyClass() End."); 7 } 8 public Task<double> GetValueAsync(double num1, double num2) 9 { 10 return Task.Run(() => 11 { 12 for (int i = 0; i < 1000000; i++) 13 { 14 num1 = num1 / num2; 15 } 16 return num1; 17 }); 18 } 19 public async void DisplayValue() 20 { 21 double result = await GetValueAsync(1234.5, 1.01);//此处会开新线程处理GetValueAsync任务,然后方法马上返回 22 //这之后的所有代码都会被封装成委托,在GetValueAsync任务完成时调用 23 System.Diagnostics.Debug.WriteLine("Value is : " + result); 24 } 25 }
1 private async void btnClick_Click(object sender, EventArgs e) 2 { 3 long length = await AccessWebAsync(); 4 5 // 这里可以做一些不依赖回复的操作 6 OtherWork(); 7 8 this.richTextBox1.Text += String.Format("\n 回复的字节长度为: {0}.\r\n", length); 9 txbMainThreadID.Text = Thread.CurrentThread.ManagedThreadId.ToString(); 10 } 11 12 // 使用C# 5.0中提供的async 和await关键字来定义异步方法 13 // 从代码中可以看出C#5.0 中定义异步方法就像定义同步方法一样简单。 14 // 使用async 和await定义异步方法不会创建新线程, 15 // 它运行在现有线程上执行多个任务. 16 // 此时不知道大家有没有一个疑问的?在现有线程上(即UI线程上)运行一个耗时的操作时, 17 // 为什么不会堵塞UI线程的呢? 18 // 这个问题的答案就是 当编译器看到await关键字时,线程会 19 private async Task<long> AccessWebAsync() 20 { 21 MemoryStream content = new MemoryStream(); 22 23 // 对MSDN发起一个Web请求 24 HttpWebRequest webRequest = WebRequest.Create("http://msdn.microsoft.com/zh-cn/") as HttpWebRequest; 25 if (webRequest != null) 26 { 27 // 返回回复结果 28 using (WebResponse response = await webRequest.GetResponseAsync()) 29 { 30 using (Stream responseStream = response.GetResponseStream()) 31 { 32 await responseStream.CopyToAsync(content); 33 } 34 } 35 } 36 37 txbAsynMethodID.Text = Thread.CurrentThread.ManagedThreadId.ToString() ; 38 return content.Length; 39 } 40 41 private void OtherWork() 42 { 43 this.richTextBox1.Text += "\r\n等待服务器回复中.................\n"; 44 }