zoukankan      html  css  js  c++  java
  • 多线程(5)async&await

      .net 4.0的Task已经让我们可以非常简单地使用多线程,并且可以有返回值,也可以支持线程的取消等操作,可谓已经很强大了。但.net 4.5为我们带来了async&await,使得实现多线程的写法更简单,更优美,更符合线性思维。

    下面通过一个例子来演示通过Task和async&await分别如何实现,并且最后还附上代码执行顺序图。

    使用Task实现

    如下代码:

     1 #region 使用Task实现
     2 static void TestByTask()
     3 {
     4     Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
     5     var task = Task.Factory.StartNew<string>(() =>
     6     {
     7         return GetNameByTask();
     8     });
     9     Console.WriteLine("get another thread result,result:" + task.Result);
    10     Console.WriteLine("main thread completed!");
    11 }
    12 
    13 static string GetNameByTask()
    14 {
    15     Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
    16     return "mcgrady";
    17 } 
    18 #endregion

    输出结果:

    使用async&await实现

     假如使用async&await如何实现呢,如下代码:

     1 #region 使用async&await实现
     2 static async void TestByAsyncAwait()
     3 {
     4     Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
     5     var name = GetNameByAsyncAwait();
     6 
     7     Console.WriteLine(string.Format("get another thread result,result:{0}", await name));
     8     Console.WriteLine("main thread completed!");
     9 }
    10 
    11 static async Task<string> GetNameByAsyncAwait()
    12 {
    13     return await Task.Factory.StartNew<string>(() =>
    14     {
    15         Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
    16         return "mcgrady";
    17     });
    18 } 
    19 #endregion

    输出结果:

    输出结果跟使用Task相同。

    代码执行流程如下图:

    完整代码:

     1 namespace ConsoleApplication25
     2 {
     3     class Program
     4     {
     5         static void Main(string[] args)
     6         {
     7             //1,使用task实现
     8             //TestByTask();
     9 
    10             //2,使用async&await实现
    11             TestByAsyncAwait();
    12 
    13             Console.ReadKey();
    14         }
    15 
    16         #region 使用Task实现
    17         static void TestByTask()
    18         {
    19             Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
    20             var task = Task.Factory.StartNew<string>(() =>
    21             {
    22                 return GetNameByTask();
    23             });
    24             Console.WriteLine("get another thread result,result:" + task.Result);
    25             Console.WriteLine("main thread completed!");
    26         }
    27 
    28         static string GetNameByTask()
    29         {
    30             Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
    31             return "mcgrady";
    32         } 
    33         #endregion
    34 
    35         #region 使用async&await实现
    36         static async void TestByAsyncAwait()
    37         {
    38             Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
    39             var name = GetNameByAsyncAwait();
    40 
    41             Console.WriteLine(string.Format("get another thread result,result:{0}", await name));
    42             Console.WriteLine("main thread completed!");
    43         }
    44 
    45         static async Task<string> GetNameByAsyncAwait()
    46         {
    47             return await Task.Factory.StartNew<string>(() =>
    48             {
    49                 Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
    50                 return "mcgrady";
    51             });
    52         } 
    53         #endregion
    54     }
    55 }
    View Code
  • 相关阅读:
    centos8 安装vmware需要的内核头文件 kernel-headers.
    centos7开启ssh服务
    systemctl命令的使用及服务状态的查看
    centos WPS 字体安装
    CentOS8 使用 aliyun 阿里云 镜像站点的方法
    CentOS提示::unknown filesystem type 'ntfs'自动挂载NTFS分区的U盘或者移动硬盘
    Aria2 Centos8 安装配置
    centos7 更新Firefox版本
    线程内容详解
    进程池、进程池和多进程的性能测试、进程池的其他机制、进程池的回调函数
  • 原文地址:https://www.cnblogs.com/mcgrady/p/7071029.html
Copyright © 2011-2022 走看看