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

  • 相关阅读:
    为什么GNU grep如此之快?
    在百度nlp实习一个月时间里用到的shell操作
    InfoPi简介、试用链接、资料索引
    自定义worker的方法,及一例
    2017.1.9版给信息源新增:max_len、max_db字段
    手把手写一个html_json信息源
    定义信息源的一些示例(xml文件)
    启用https协议的方法
    安装第三方Python模块,增加InfoPi的健壮性
    更新日志(建议升级到2017.1.18a) && 更新程序的方法
  • 原文地址:https://www.cnblogs.com/sunky/p/11750853.html
Copyright © 2011-2022 走看看