来自 澳门新葡亰 2019-11-21 18:24 的文章
当前位置: 澳门新葡亰app > 澳门新葡亰 > 正文

澳门新葡亰app系统会在内存中成立三个新的经过

走进异步编制程序的世界 - 早前接触 async/await

 

  那是学习异步编制程序的入门篇。

  涉及 C# 5.0 引进的 async/await,但在支配台出口示例时平时会选用 C# 6.0 的 $"" 来拼接字符串,约等于string.Format() 方法。

 

目录

  • What's 异步?
  • async/await 结构
  • What’s 异步方法?

 

一、What's 异步?

     运行程序时,系统会在内部存款和储蓄器中开创三个新的经过。进程是构成运路程序能源的聚合。

     在进程之中,有可以称作线程的水源对象,它意味着的是真的的奉行顺序。系统会在 Main 方法的首先行语句就初步线程的实施。

 

     线程:

     ①私下认可情景,八个进度只含有多个线程,从程序的始发到实行实现;

     ②线程能够派生自此外线程,所以多个经过能够分包差别情况的多少个线程,来进行顺序的区别部分;

     ③七个经过中的多个线程,将分享该进程的能源;

     ④系统为Computer施行所设计的单元是线程,而非进程。

 

     日常的话大家写的调控台程序都只使用了叁个线程,从第一条语句按梯次执行到最后一条。但在不菲的景观下,这种轻巧的模子会在质量或顾客体验上不佳。

     比方:服务器要相同的时间管理来自多少个客商端程序的号召,又要等待数据库和任何设备的响应,那将严重影响属性。程序不应当将时间浪费在响应上,而要在守候的还要实施其它职责!

     未来大家开头步向异步编制程序。在异步程序中,代码无需根据编写时的逐豆蔻梢头试行。当时大家需求用到 C# 5.0 引进的 async/await 来创设异步方法。

 

     大家先看一下不用异步的演示:

 1     class Program
 2     {
 3         //创建计时器
 4         private static readonly Stopwatch Watch = new Stopwatch();
 5 
 6         private static void Main(string[] args)
 7         {
 8             //启动计时器
 9             Watch.Start();
10 
11             const string url1 = "http://www.cnblogs.com/";
12             const string url2 = "http://www.cnblogs.com/liqingwen/";
13 
14             //两次调用 CountCharacters 方法(下载某网站内容,并统计字符的个数)
15             var result1 = CountCharacters(1, url1);
16             var result2 = CountCharacters(2, url2);
17 
18             //三次调用 ExtraOperation 方法(主要是通过拼接字符串达到耗时操作)
19             for (var i = 0; i < 3; i++)
20             {
21                 ExtraOperation(i + 1);
22             }
23 
24             //控制台输出
25             Console.WriteLine($"{url1} 的字符个数:{result1}");
26             Console.WriteLine($"{url2} 的字符个数:{result2}");
27 
28             Console.Read();
29         }
30 
31         /// <summary>
32         /// 统计字符个数
33         /// </summary>
34         /// <param name="id"></param>
35         /// <param name="address"></param>
36         /// <returns></returns>
37         private static int CountCharacters(int id, string address)
38         {
39             var wc = new WebClient();
40             Console.WriteLine($"开始调用 id = {id}:{Watch.ElapsedMilliseconds} ms");
41 
42             var result = wc.DownloadString(address);
43             Console.WriteLine($"调用完成 id = {id}:{Watch.ElapsedMilliseconds} ms");
44 
45             return result.Length;
46         }
47 
48         /// <summary>
49         /// 额外操作
50         /// </summary>
51         /// <param name="id"></param>
52         private static void ExtraOperation(int id)
53         {
54             //这里是通过拼接字符串进行一些相对耗时的操作
55             var s = "";
56 
57             for (var i = 0; i < 6000; i++)
58             {
59                 s += i;
60             }
61 
62             Console.WriteLine($"id = {id} 的 ExtraOperation 方法完成:{Watch.ElapsedMilliseconds} ms");
63         }
64     }

澳门新葡亰官网APP 1

     图1-1 运维的法力图,以纳秒(ms卡塔尔国为单位

 

  【备注】平时的话,间接拼接字符串是后生可畏种相比耗品质的手段,若是对字符串拼接有品质须要的话应该使用 StringBuilder。

  【注意】每一次运维的结果或许两样。不管哪次调节和测量检验,绝超过八分之四日子都浪费前一遍调用(CountCharacters 方法卡塔 尔(阿拉伯语:قطر‎,即在守候网址的响应上。

 

澳门新葡亰官网APP 2

  图1-2 依据实践结果所画的时日轴

 

     有人曾幻想着那样进步品质的章程:在调用 A 方法时,不等它施行完,直接实践 B 方法,然后等 A 方法试行到位再管理。

     C# 的 async/await 就能够允许大家这么弄。

澳门新葡亰官网APP 3澳门新葡亰官网APP 4

 1     class Program
 2     {
 3         //创建计时器
 4         private static readonly Stopwatch Watch = new Stopwatch();
 5 
 6         private static void Main(string[] args)
 7         {
 8             //启动计时器
 9             Watch.Start();
10 
11             const string url1 = "http://www.cnblogs.com/";
12             const string url2 = "http://www.cnblogs.com/liqingwen/";
13 
14             //两次调用 CountCharactersAsync 方法(异步下载某网站内容,并统计字符的个数)
15             Task<int> t1 = CountCharactersAsync(1, url1);
16             Task<int> t2 = CountCharactersAsync(2, url2);
17 
18             //三次调用 ExtraOperation 方法(主要是通过拼接字符串达到耗时操作)
19             for (var i = 0; i < 3; i++)
20             {
21                 ExtraOperation(i + 1);
22             }
23 
24             //控制台输出
25             Console.WriteLine($"{url1} 的字符个数:{t1.Result}");
26             Console.WriteLine($"{url2} 的字符个数:{t2.Result}");
27 
28             Console.Read();
29         }
30 
31         /// <summary>
32         /// 统计字符个数
33         /// </summary>
34         /// <param name="id"></param>
35         /// <param name="address"></param>
36         /// <returns></returns>
37         private static async Task<int> CountCharactersAsync(int id, string address)
38         {
39             var wc = new WebClient();
40             Console.WriteLine($"开始调用 id = {id}:{Watch.ElapsedMilliseconds} ms");
41 
42             var result = await wc.DownloadStringTaskAsync(address);
43             Console.WriteLine($"调用完成 id = {id}:{Watch.ElapsedMilliseconds} ms");
44 
45             return result.Length;
46         }
47 
48         /// <summary>
49         /// 额外操作
50         /// </summary>
51         /// <param name="id"></param>
52         private static void ExtraOperation(int id)
53         {
54             //这里是通过拼接字符串进行一些相对耗时的操作
55             var s = "";
56 
57             for (var i = 0; i < 6000; i++)
58             {
59                 s += i;
60             }
61 
62             Console.WriteLine($"id = {id} 的 ExtraOperation 方法完成:{Watch.ElapsedMilliseconds} ms");
63         }
64     }

那是矫正后的代码

澳门新葡亰官网APP 5

 图1-3 修正后的推行结果图

澳门新葡亰官网APP 6

图1-4 依据参与异步后的实施结果画的时辰轴。

 

  我们观察时间轴开掘,新版代码比旧版快了累累(由于网络波动的缘由,很只怕会现身耗费时间比此前长的意况卡塔 尔(阿拉伯语:قطر‎。那是出于 ExtraOperation 方法的数十二回调用是在 CountCharactersAsync 方法调用时等待响应的长河中开展的。全体的干活都以在主线程中达成的,未有开立异的线程。

 

澳门新葡亰app,  【改动解析】只改了多少个细节之处,直接进行代码的话只怕看不出来,改造如下:

   澳门新葡亰官网APP 7

 图1-5

澳门新葡亰官网APP 8

  图1-6

 

  ①从 Main 方法施行到 CountCharactersAsync(1, url1) 方法时,该方法会立刻回到,然后才会调用它此中的办法开首下载内容。该办法再次回到的是二个Task<int> 类型的占位符对象,表示陈设开展的干活。这一个占位符最后会回到 int 类型的值。

  ②如此就足以不用等 CountCharactersAsync(1, url1) 方法施行到位就能够延续拓宽下一步操作。到奉行 CountCharactersAsync(2, url2)  方法时,跟 ① 同样重回 Task<int> 对象。

  ③然后,Main 方法继续试行一遍 ExtraOperation 方法,同一时候五回 CountCharactersAsync 方法仍旧在反复职业 。

  ④t1.Result 和 t2.Result 是指从 CountCharactersAsync 方法调用的 Task<int> 对象取结果,假若还并未有结果的话,将拥塞,直有结果重临截止。

 

二、async/await 结构

     先剖判一下专门的学问名词:

澳门新葡亰官网APP,     同步方法:二个顺序调用有个别方法,等到其进行到位今后才进行下一步操作。那也是暗中同意的样式。

     异步方法:三个主次调用有个别方法,在拍卖达成在此之前就重回该办法。通过 async/await 我们就足以兑现那体系型的方法。

 

     async/await 结构可分为三部分:

     (1卡塔尔国调用方法:该办法调用异步方法,然后在异步方法实施其任务的时候继续施行;

     (2卡塔 尔(英语:State of Qatar)异步方法:该措施异步推行工作,然后立时回到到调用方法;

     (3卡塔 尔(阿拉伯语:قطر‎await 表明式:用于异步方法内部,建议需求异步实行的职责。贰个异步方法能够满含七个await 表达式(子虚乌有 await 表明式的话 IDE 会发出警告卡塔尔国。

 

  以后我们来解析一下示范。

澳门新葡亰官网APP 9

  图2-1

 

 三、What’s 异步方法

     异步方法:在执行到位前及时回去调用方法,在调用方法继续推行的历程中形成任务。

     语法剖判:

     (1卡塔 尔(阿拉伯语:قطر‎关键字:方法头使用 async 修饰。

     (2卡塔尔国供给:包蕴N(N>0卡塔尔 个 await 表明式(子虚乌有 await 表明式的话 IDE 会发出警告卡塔 尔(英语:State of Qatar),表示需求异步施行的职分。

     (3卡塔 尔(阿拉伯语:قطر‎再次来到类型:只可以回到 3 种档案的次序(void、Task 和 Task<T>卡塔尔国。Task 和 Task<T> 标识再次来到的靶子会在前不久做到职业,表示调用方法和异步方法能够继续试行。

     (4卡塔 尔(英语:State of Qatar)参数:数量不限,但不能够动用 out 和 ref 关键字。

     (5卡塔 尔(阿拉伯语:قطر‎命名约定:方法后缀名应以 Async 结尾。

     (6卡塔 尔(阿拉伯语:قطر‎别的:无名格局和 拉姆da 表明式也得以视作异步对象;async 是二个上下文关键字;关键字 async 必需在再次来到类型前。

 澳门新葡亰官网APP 10

图3-1 异步方法的简短结构图

 

小结

  1.深入剖判了经过和线程的定义

  2.异步的归纳用法

  3.async/await 结构体

  4.异步办保加俄克拉荷马城语法结构

 

传送门

  下篇:《[走进异步编制程序的社会风气 -

深入分析异步方法(上卡塔 尔(阿拉伯语:قطر‎](

浅析异步方法(下卡塔尔国](

  后篇:《走进异步编制程序的社会风气 - 在 GUI 中进行异步操作》

 


本文首联:

【参考】《Illustrated C# 2012》

本文由澳门新葡亰app发布于澳门新葡亰,转载请注明出处:澳门新葡亰app系统会在内存中成立三个新的经过

关键词: