zoukankan      html  css  js  c++  java
  • async和await执行顺序

    关于执行顺序和线程ID,写了一个小程序来检测学习:

     1 using System;
     2 using System.Net;
     3 using System.Threading;
     4 using System.Threading.Tasks;
     5 
     6 namespace AsyncOrder
     7 {
     8     class Program
     9     {
    10         static void Main(string[] args)
    11         {
    12             Console.WriteLine($"Main: befor Task1 。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
    13             const string url1 = "http://www.163.com/";
    14             const string url2 = "http://www.baidu.com/";
    15 
    16             Task<string> t1 = p1(1, url1);
    17             Task<string> t2 = p1(2, url2);
    18 
    19             DoSomeThing(3, "main");
    20 
    21             Console.WriteLine($"网页:{url1}长度:{t1.Result.Length}。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
    22             Console.WriteLine($"网页:{url2}长度:{t2.Result.Length}。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
    23 
    24             DoSomeThing(4, "main");
    25 
    26             Console.WriteLine("按任意键退出...");
    27             Console.ReadKey();
    28         }
    29 
    30         private static async Task<string> p1(int id, string url = "http://www.baidu.com")
    31         {
    32             DoSomeThing(id,"P1");
    33             Console.WriteLine($"任务ID:{id} ,p1: befor await。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
    34             string ret = await p2(id,url);
    35             Console.WriteLine($"任务ID:{id} ,p1: after await。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
    36             return ret;
    37         }
    38 
    39         private static async Task<string> p2(int id, string url = "http://www.baidu.com")
    40         {
    41             DoSomeThing(id, "P2");
    42             Console.WriteLine($"任务ID:{id} ,p2: befor await。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
    43             string ret = await GetWeb(id, url);
    44             Console.WriteLine($"任务ID:{id} ,p2: after await。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
    45             return ret;
    46         }
    47 
    48         private static void DoSomeThing(int id, string v)
    49         {
    50             Console.WriteLine($"任务ID:{id} ,父程序:{v}。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
    51         }
    52 
    53         private static async Task<string> GetWeb(int id , string url = "http://www.baidu.com")
    54         {
    55             var wc = new WebClient();
    56             Console.WriteLine($"任务ID:{id} ,GetWeb: befor await wc。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
    57             var temp = await wc.DownloadStringTaskAsync(url);
    58             Console.WriteLine($"任务ID:{id} ,GetWeb: after await wc。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
    59             return temp.ToString();
    60         }
    61     }
    62 }

    执行结果为:

     注意:有的时候任务1 2中的await之后的线程ID为同一个,不解。若有人明白,烦请解惑。

  • 相关阅读:
    在阿里云“专有网络”网络类型中配置vsftpd
    Ubuntu 16.04下开启Mysql 3306端口远程访问
    .net core 2.0 报错:error NU1102: Unable to find package ...
    .NET Core Runtime ARM32 builds now available
    .NET Core on Raspberry Pi
    .NET Core 跨平台发布(dotnet publish)
    使用vscode开发调试.net core应用程序并部署到Linux跨平台
    docker容器镜像删除
    使用阿里docker镜像加速器加速
    树莓派3b基于UbuntuMate下载中文输入法
  • 原文地址:https://www.cnblogs.com/sunky/p/11750853.html
Copyright © 2011-2022 走看看