• 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("
     回复的字节长度为:  {0}.
    ", 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 += "
    等待服务器回复中.................
    ";
    44         }
    View Code
  • 相关阅读:
    Git 简介
    Web开发——jQuery基础
    VueJS教程4
    VueJS教程3
    VueJS教程2
    linux命令,系统安全相关命令--改变文件属性与权限(chgrp,chwon,chmod)
    linux命令,系统安全相关命令--su
    linux命令,系统安全相关命令--passwd
    git常用命令整理
    vi常用按键
  • 原文地址:https://www.cnblogs.com/baicaocanhua/p/5285233.html
Copyright © 2020-2023  润新知