zoukankan      html  css  js  c++  java
  • C# async/await使用举例

    1、async/await几点总结

      a、被async标记的方法,返回值类型只能为voidTaskTask<T>。

      b、被async标记的方法,内部可以有await修饰符,表明内部逻辑某处有异步执行方法。

      c、被async标记的方法,内部可以没有await修饰符,所有逻辑将同步执行。

      d、task任务执行创建的线程为后台线程,主线如果不Task.result获取结果,主线程结束,异步任务未完成也结束。

      f、await关键字:方法要被async修饰,才能在方法内部使用await,await后面必须是一个task或返回task的方法,标记了await,就说明后面的操作是一个异步操作。

    2、应用实例

     1   static void Main(string[] args)
     2         {
     3             Console.WriteLine("主线程开始");
     4             Console.WriteLine("主线程ID:" + Thread.CurrentThread.ManagedThreadId);
     5             var task = GetLengthAsync();
     6             Console.WriteLine("主线程继续");
     7             var timer = new Stopwatch();
     8             timer.Start(); 
     9             Console.WriteLine("task的返回值是" + task.Result);
    10             timer.Stop();
    11             Console.WriteLine("耗时:" + timer.Elapsed.TotalSeconds + ""); //显示时间
    12             Console.WriteLine("主线程ID:" + Thread.CurrentThread.ManagedThreadId);
    13             Console.WriteLine("主线程结束");
    14         }
    15 
    16         private static async Task<int> GetLengthAsync()
    17         {
    18             Console.WriteLine("GetLengthAsync()开始");
    19             Console.WriteLine("GetLengthAsync()线程ID:" + Thread.CurrentThread.ManagedThreadId);
    20             var str = await GetStringAsync();
    21             Console.WriteLine("GetLengthAsync()线程ID:" + Thread.CurrentThread.ManagedThreadId);
    22             Console.WriteLine("GetLengthAsync()执行完毕");
    23             return str.Length;
    24             
    25         }
    26 
    27         private static Task<string> GetStringAsync()
    28         {
    29             Console.WriteLine("GetStringAsync()开始");
    30             Console.WriteLine("GetStringAsync()线程ID:" + Thread.CurrentThread.ManagedThreadId);
    31             Console.WriteLine("GetStringAsync()结束");
    32             return Task.Run(() =>
    33             {
    34                 Task.Delay(5000);
    35                 Console.WriteLine("异步任务开始执行");
    36                 Console.WriteLine("异步任务开始执行线程ID:" + Thread.CurrentThread.ManagedThreadId);
    37                 Console.WriteLine("异步任务耗时10s:");
    38                 Thread.Sleep(10000);
    39                 Console.WriteLine("异步任务执行完毕");
    40                 return "异步任务执行结果";
    41             });
    42             
    43         }

    运行结果显示。

    注释调9行结果显示。表明,主线程结束,异步任务未完成也结束。

    部分内容参考:https://www.cnblogs.com/sheng-jie/p/6471986.html

  • 相关阅读:
    [SCOI 2003] 字符串折叠
    [POJ 3252] Round Numbers
    [ZJOI 2010] 数字计数
    [POJ 2282] The Counting Problem
    [POJ 1191] 棋盘分割
    [POJ 3345] Bribing FIPA
    [POJ 2785] 4 Values whose Sum is 0
    [NOIP 2017] 列队
    [NOIP 2017] 宝藏
    基于Qt Gui的Led控制显示程序
  • 原文地址:https://www.cnblogs.com/mojiejushi/p/13200748.html
Copyright © 2011-2022 走看看