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     }
View Code
 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 }
View Code
 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         }
View Code

 

posted @ 2016-03-16 21:23  败草麦麦  阅读(673)  评论(0编辑  收藏  举报