• 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为同一个,不解。若有人明白,烦请解惑。

  • 相关阅读:
    数据库语句
    Java类和数据结构中常用的方法
    java知识点
    JVM相关知识
    Java实现三种常用的查找算法(顺序查查找,折半查找,二叉排序树查找)
    SharedPreference作用及数据操作模式
    Java实现7种常见的排序算法
    钱多多软件制作03
    钱多多软件制作02
    钱多多软件制作01
  • 原文地址:https://www.cnblogs.com/sunky/p/11750853.html
Copyright © 2020-2023  润新知