【美高梅开户网址】走进异步编制程序的社会风气,初阶接触

走进异步编制程序的社会风气 – 开始接触 async/await

 

走进异步编制程序的社会风气 – 起始接触 async/await

 

[C#] 开端接触 async/await 异步编制程序,

原来的书文链接:

  那是读书异步编制程序的入门篇。

  涉及 C# 五.0 引进的 async/await,但在决定台出口示例时日常会选用 C#
6.0 的 $”” 来拼接字符串,也正是string.Format() 方法。

 

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

  涉及 C# 5.0 引进的 async/await,但在支配台出口示例时通常会动用 C#
6.0 的 $”” 来拼接字符串,也正是string.Format() 方法。

 

初叶接触 async/await 异步编制程序

走进异步编制程序的社会风气 – 开头接触 async/await

 

目录

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

 

目录

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

 

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

 

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

  涉及 C# 伍.0 引进的 async/await,但在控制台出口示例时常常会利用 C#
陆.0 的 $”” 来拼接字符串,相当于string.Format() 方法。

 

一、What’s 异步?

     运行程序时,系统会在内部存款和储蓄器中创设3个新的长河。进度是组成运转程序能源的联谊。

     在经过之中,有号称线程的根本对象,它表示的是实在的实施顺序。系统会在 Main
方法的率先行语句就从头线程的举行。

【美高梅开户网址】走进异步编制程序的社会风气,初阶接触。 

     线程:

     壹私下认可情状,二个经过只含有多个线程,从程序的开始到实施落成;

   
 二线程能够派生自其余线程,所以三个历程能够包罗分歧情状的五个线程,来实施顺序的例外部分;

     叁三个进度中的四个线程,将共享该进度的财富;

     肆系统为电脑执行所设计的单元是线程,而非进程。

 

   
 壹般的话大家写的控制台程序都只行使了3个线程,从第二条语句按梯次执行到结尾一条。但在重重的图景下,那种回顾的模子会在品质或用户体验上不佳。

   
 例如:服务器要同时处理来自多少个客户端程序的乞求,又要等待数据库和此外设备的响应,那将严重影响属性。程序不应有将时刻浪费在响应上,而要在守候的同时施行此外职责!

   
 以后大家开端进入异步编制程序。在异步程序中,代码不要求遵守编写时的依次执行。那时大家要求用到
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     }

美高梅开户网址 1

     图1-一 运维的作用图,以飞秒(ms)为单位

 

  【备注】1般的话,间接拼接字符串是壹种相比较耗品质的一手,尽管对字符串拼接有质量须要的话应该利用
StringBuilder。

  【注意】每便运维的结果只怕不一致。不管哪次调节和测试,绝大多数时刻都浪费前五回调用(CountCharacters
方法),即在伺机网址的响应上。

 

美高梅开户网址 2

  图1-2依照实施结果所画的时间轴

 

     有人曾幻想着如此进步品质的秘籍:在调用 A
方法时,不等它执行完,直接执行 B 方法,然后等 A 方法执行到位再处理。

     C# 的 async/await 就足以允许大家那样弄。

美高梅开户网址 3美高梅开户网址 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     }

那是修改后的代码

美高梅开户网址 5

 图一-三 修改后的实行结果图

美高梅开户网址 6

图一-肆 遵照参与异步后的施行结果画的小时轴。

 

  我们观望时间轴发现,新版代码比旧版快了成千成万(由于互联网波动的因由,很恐怕会合世耗费时间比此前长的情形)。那是由于
ExtraOperation 方法的数十一回调用是在
CountCharactersAsync 方法调用时等待响应的长河中进行的。全部的工作都以在主线程中完毕的,没有创建新的线程。

 

  【改动分析】只改了几个细节的地点,间接实行代码的话只怕看不出来,改动如下:

   美高梅开户网址 7

 图1-5

美高梅开户网址 8

  图1-6

 

  1从 Main 方法执行到 CountCharactersAsync(1, url一)
方法时,该方法会马上回到,然后才会调用它个中的主意开首下载内容。该办法重返的是二个Task<int>
类型的占位符对象,表示安顿进行的工作。那个占位符末了会回到 int
类型的值。

  贰这么就足以不用等 CountCharactersAsync(一, url1)
方法执行到位就能够继继续展览开下一步操作。到执行 CountCharactersAsync(2,
url贰)  方法时,跟 1 壹样再次回到 Task<int> 对象。

  3然后,Main 方法继续执行一回 ExtraOperation
方法,同时三遍 CountCharactersAsync 方法仍旧在时时刻刻工作 。

  肆t壹.Result 和 t二.Result 是指从 CountCharactersAsync 方法调用的
Task<int>
对象取结果,假使还尚未结果的话,将卡住,直有结果回到结束。

 

一、What’s 异步?

     运营程序时,系统会在内存中开创叁个新的进度。进度是整合运转程序能源的晤面。

     在进程之中,有号称线程的根本对象,它象征的是真的的实施顺序。系统会在 Main
方法的首先行语句就起来线程的进行。

 

     线程:

     一默认景色,两个历程只含有2个线程,从程序的起来到执行完成;

   
 2线程能够派生自别的线程,所以多个进度能够分包不一样意况的多个线程,来实施顺序的差别部分;

     3二个进度中的多个线程,将共享该过程的能源;

     四类别为电脑执行所设计的单元是线程,而非进度。

 

   
 1般的话我们写的控制台程序都只利用了1个线程,从第2条语句按顺序执行到结尾一条。但在众多的境况下,那种不难的模子会在性质或用户体验上不佳。

   
 例如:服务器要同时处理来自多个客户端程序的乞请,又要等待数据库和其余设备的响应,那将严重影响属性。程序不该将时刻浪费在响应上,而要在等候的同时履行其它职分!

   
 未来我们开始进入异步编制程序。在异步程序中,代码不须要遵守编写时的种种执行。那时大家须求用到
C# 伍.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     }

美高梅开户网址 9

     图一-1 运维的成效图,以皮秒(ms)为单位

 

  【备注】一般的话,间接拼接字符串是一种比较耗品质的伎俩,假如对字符串拼接有性能须求的话应该采取StringBuilder。

  【注意】每便运营的结果可能两样。不管哪次调节和测试,绝超越6/10年美国首都浪费前三回调用(CountCharacters
方法),即在等候网址的响应上。

 

美高梅开户网址 10

  图1-贰依照实施结果所画的日子轴

 

     有人曾幻想着那样进步质量的措施:在调用 A
方法时,不等它执行完,直接实施 B 方法,然后等 A 方法执行到位再处理。

     C# 的 async/await 就足以允许大家这么弄。

美高梅开户网址 11美高梅开户网址 12

 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     }

那是修改后的代码

美高梅开户网址 13

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

美高梅开户网址 14

图壹-四 依据参预异步后的施行结果画的时间轴。

 

  大家着眼时间轴发现,新版代码比旧版快了重重(由于网络波动的来由,很大概会面世耗费时间比在此以前长的状态)。那是由于
ExtraOperation 方法的数次调用是在
CountCharactersAsync 方法调用时等待响应的历程中开始展览的。全数的劳作都以在主线程中做到的,未有创建新的线程。

 

  【改动分析】只改了几个细节的地点,直接开始展览代码的话也许看不出来,改动如下:

   美高梅开户网址 15

 图1-5

美高梅开户网址 16

  图1-6

 

  一从 Main 方法执行到 CountCharactersAsync(一, url1)
方法时,该方法会立时回去,然后才会调用它里面包车型地铁点子开首下载内容。该措施再次回到的是叁个Task<int>
类型的占位符对象,表示安排开始展览的劳作。这几个占位符最后会回来 int
类型的值。

  贰这么就足以无需等 CountCharactersAsync(1, url壹)
方法执行到位就能够持续举办下一步操作。到实施 CountCharactersAsync(2,
url二)  方法时,跟 壹 1样重回 Task<int> 对象。

  三然后,Main 方法继续执行叁回 ExtraOperation
方法,同时一遍 CountCharactersAsync 方法依然在频频工作 。

  肆t壹.Result 和 t二.Result 是指从 CountCharactersAsync 方法调用的
Task<int>
对象取结果,假诺还尚无结果的话,将阻塞,直有结果回到截至。

 

目录

  • What’s 异步?

  • async/await 结构

  • What’s 异步方法?

 

目录

  • What’s
    异步?

  • async/await
    结构

  • What’s
    异步方法?

 

二、async/await 结构

     先解析一下专业名词:

     同步方法:1个顺序调用有些方法,等到其履行到位将来才开始展览下一步操作。那也是默许的花样。

     异步方法:1个程序调用有些方法,在处理实现从前就赶回该措施。通过
async/await 大家就足以兑现那系列型的法门。

 

     async/await 结构可分为3局地:

     (一)调用方法:该方式调用异步方法,然后在异步方法执行其职责的时候继续执行;

     (二)异步方法:该情势异步执行工作,然后随即回到到调用方法;

     (3)await
表明式:用于异步方法内部,建议供给异步执行的任务。2个异步方法能够包涵八个await 表明式(不存在 await 表明式的话 IDE 会发出警示)。

 

  今后我们来分析一下演示。

美高梅开户网址 17

  图2-1

 

二、async/await 结构

     先解析一下专业名词:

     同步方法:一个主次调用有个别方法,等到其实施到位未来才举办下一步操作。那也是暗中认可的情势。

     异步方法:一个先后调用某些方法,在处理到位从前就赶回该方法。通过
async/await 大家就能够兑现那体系型的方法。

 

     async/await 结构可分为3局部:

     (壹)调用方法:该办法调用异步方法,然后在异步方法执行其任务的时候继续执行;

     (2)异步方法:该方法异步执行工作,然后随即回到到调用方法;

     (叁)await
表达式:用于异步方法内部,建议要求异步执行的职务。多少个异步方法能够包罗五个await 表达式(不设有 await 表明式的话 IDE 会发出警告)。

 

  现在大家来分析一下示范。

美高梅开户网址 18

  图2-1

 

一、What’s 异步?

   
 运维程序时,系统会在内部存款和储蓄器中开创3个新的长河。进度是整合运维程序财富的会晤。
   
 在进度之中,有号称线程的木本对象,它象征的是确实的实行顺序。系统会在
Main 方法的首先行语句就初阶线程的推行。        线程:    
 (一)暗许处境,一个进度只含有三个线程,从程序的发端到执行达成;    
 (二)线程可以派生自别的线程,所以三个进度能够涵盖差别情状的七个线程,来进行顺序的差异部分;
     (3)叁个经过中的三个线程,将共享该进程的能源;    
 (4)系统为计算机执行所安顿的单元是线程,而非进程。      
 一般的话大家写的控制台程序都只使用了3个线程,从第二条语句按梯次执行到最后一条。但在广大的情事下,那种归纳的模子会在质量或用户体验上倒霉。
   
 例如:服务器要同时处理来自多少个客户端程序的乞求,又要等待数据库和其余设备的响应。那将严重影响属性。程序不应有将时间浪费在响应上,而要在等候的同时履行此外义务!
   
 现在大家初步上学异步编程。在异步程序中,代码不须求依照编写时的次第执行。那时我们须要用到
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     }

【注意】每便运转的结果或许两样。不管哪次调节和测试,绝当先56%日子都浪费前两次调用(CountCharacters
方法),即在等候网址的响应上。     图一-二 依据实施结果所画的岁月轴

 

     有人曾幻想着那样进步性能的艺术:在调用 A
方法时,不等它执行完,直接执行 B 方法,然后等 A 方法执行到位再处理。    
 C# 的 async/await 就能够允许我们那样弄。
美高梅开户网址 19 一 class
Program 二 { 3 //创立计时器 四 private static readonly Stopwatch 沃特ch =
new Stopwatch(); 伍 陆 private static void Main(string[] args) 柒 { 8
//运营计时器 九 沃特ch.Start(); 十 11 const string url1 =
“”; 12 const string url2 =
“”; 1③ 1四 //两遍调用
CountCharactersAsync 方法(异步下载某网址内容,并总结字符的个数) 一5Task<int> t一 = CountCharactersAsync(一, url壹); 1六 Task<int>
t二 = CountCharactersAsync(二, url二); 一7 18 //一遍调用 ExtraOperation
方法(主若是透过拼接字符串达到耗费时间操作) 1玖 for (var i = 0; i < 三;
i++) 20 { 二1 ExtraOperation(i + 壹); 22 } 二三 2肆 //控制台出口 贰五Console.WriteLine($”{url1} 的字符个数:{t一.Result}”); 26Console.WriteLine($”{url2} 的字符个数:{t二.Result}”); 27 2⑧Console.Read(); 2玖 } 30 3一 /// <summary> 3二 /// 总计字符个数 33
/// </summary> 3四 /// <param name=”id”></param> 35 ///
<param name=”address”></param> 3六 ///
<returns></returns> 三7 private static async Task<int>
CountCharactersAsync(int id, string address) 3八 { 3⑨ var wc = new
WebClient(); 40 Console.WriteLine($”伊始调用 id =
{id}:{沃特ch.ElapsedMilliseconds} ms”); 四壹 4二 var result = await
wc.DownloadStringTaskAsync(address); 肆3 Console.WriteLine($”调用达成 id
= {id}:{沃特ch.ElapsedMilliseconds} ms”); 4四 45 return result.Length; 四六} 四柒 4捌 /// <summary> 4九 /// 额外操作 50 /// </summary> 51
/// <param name=”id”></param> 5二 private static void
ExtraOperation(int id) 伍三 { 54
//那里是因而拼接字符串进行部分绝对耗费时间的操作 5五 var s = “”; 5六 5柒 for
(var i = 0; i < 五千; i++) 5八 { 5玖 s += i; 60 } 陆壹 62
Console.WriteLine($”id = {id} 的 ExtraOperation
方法成功:{沃特ch.ElapsedMilliseconds} ms”); 陆叁 } 6四 } 那是修改后的代码

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

图壹-四 依照参预异步后的施行结果画的年华轴。

 

  大家观望时间轴发现,新版代码比旧版快了重重(由于互联网波动的原委,很或者会出现耗费时间比以前长的境况)。那是由于
ExtraOperation 方法的数次调用是在
CountCharactersAsync 方法调用时等待响应的进程中实行的。全体的工作都以在主线程中达成的,未有开立异的线程。
 
  【改动分析】只改了多少个细节的地点,直接实行代码的话只怕看不出来,改动如下:
     图1-6

 

  壹从 Main 方法执行到 CountCharactersAsync(一, url1)
方法时,该方法会马上回去,然后才会调用它在那之中的格局起始下载内容。该格局重回的是3个Task<int>
类型的占位符对象,表示布署开始展览的干活。这么些占位符最后会回来 int
类型的值。

  二如此就足以不必等 CountCharactersAsync(1, url一)
方法执行到位就足以一连开始展览下一步操作。到实践 CountCharactersAsync(二,
url二)  方法时,跟 1 一样重临 Task<int> 对象。

  三然后,Main 方法继续执行二次 ExtraOperation
方法,同时几回 CountCharactersAsync 方法依然在持续工作 。

  4t壹.Result 和 t2.Result 是指从 CountCharactersAsync 方法调用的
Task<int>
对象取结果,假设还尚无结果的话,将阻塞,直有结果重临截止。

 

一、What’s 异步?

   
 运行程序时,系统会在内部存款和储蓄器中创建一个新的经过。线程的水源对象,它意味着的是真的的推行顺序。系统会在 Main
方法的首先行语句就起始线程的执行。

 

     线程:

     壹暗中同意景观,三个进度只含有三个线程,从程序的起初到执行完成;

   
 2线程可以派生自其余线程,所以三个经过能够涵盖不相同景观的三个线程,来推行顺序的两样部分;

     三三个历程中的五个线程,将共享该进程的能源;

     4体系为电脑执行所安排的单元是线程,而非进程。

 

   
 壹般的话我们写的控制台程序都只利用了二个线程,从第壹条语句按顺序执行到最后一条。但在众多的景况下,那种不难的模子会在性质或用户体验上不好。

   
 例如:服务器要同时处理来自三个客户端程序的伸手,又要等待数据库和任何设备的响应,那将严重影响属性。程序不应该将时刻浪费在响应上,而要在等候的同时履行此外职分!

   
 今后大家开端进入异步编程。在异步程序中,代码不须求遵从编写时的1一执行。这时咱们要求用到
C# 5.0 引进的 async/await
来营造异步方法。

 

     大家先看一下不用异步的以身作则:

美高梅开户网址 20😉

 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     }

美高梅开户网址 21😉

美高梅开户网址 22

     图一-1 运维的功力图,以阿秒(ms)为单位

 

  【备注】一般的话,直接拼接字符串是一种相比较耗品质的手腕,假若对字符串拼接有总体性要求的话应该运用
StringBuilder。

  【注意】每一回运转的结果恐怕两样。不管哪次调节和测试,绝一大半岁月都浪费前两遍调用(CountCharacters
方法),即在等候网址的响应上。

 

美高梅开户网址 23

  图壹-二依照实施结果所画的大运轴

 

     有人曾幻想着如此进步品质的方法:在调用 A
方法时,不等它执行完,直接实施 B 方法,然后等 A 方法执行到位再处理。

     C# 的 async/await 就足以允许大家如此弄。

美高梅开户网址 24

美高梅开户网址 25😉

 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     }

美高梅开户网址 26😉

美高梅开户网址 27

 图一-三 修改后的执行结果图

美高梅开户网址 28

图壹-四 依据参加异步后的进行结果画的时刻轴。

 

  咱们着眼时间轴发现,新版代码比旧版快了不少(由于网络波动的来头,很或然会现出耗费时间比在此之前长的意况)。那是由于
ExtraOperation 方法的多次调用是在
CountCharactersAsync 方法调用时等待响应的长河中开始展览的。所有的劳作都以在主线程中做到的,未有成立新的线程。

 

  【改动分析】只改了多少个细节的地点,直接开展代码的话可能看不出来,改动如下:

   美高梅开户网址 29

 图1-5

美高梅开户网址 30

  图1-6

 

  壹从 Main 方法执行到 CountCharactersAsync(1, url一)
方法时,该方法会立时赶回,然后才会调用它里面包车型大巴诀要开始下载内容。该方法再次来到的是一个Task<int>
类型的占位符对象,表示布置开始展览的劳作。那个占位符最后会回到 int
类型的值。

  2如此就能够不要等 CountCharactersAsync(壹, url壹)
方法执行到位就足以延续实行下一步操作。到执行 CountCharactersAsync(2,
url2)  方法时,跟 1 一样重回 Task<int> 对象。

  3然后,Main 方法继续执行三遍 ExtraOperation
方法,同时两回 CountCharactersAsync 方法依然在相连工作 。

  4t一.Result 和 t二.Result 是指从 CountCharactersAsync 方法调用的
Task<int>
对象取结果,若是还未有结果的话,将封堵,直有结果再次来到为止。

 

 3、What’s 异步方法

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

     语法分析:

     (壹)关键字:方法头使用 async
修饰。

     (2)供给:包蕴N(N>0) 个 await 表达式(不存在 await 表达式的话 IDE
会发出警示),表示要求异步执行的任务。

     (三)重返类型:只可以回到 三种类型(void、Task 和 Task<T>)。Task 和 Task<T>
标识重临的靶子会在后天到位工作,表示调用方法和异步方法能够继续执行。

     (四)参数:数量不限,但无法利用 out 和 ref 关键字。

     (伍)命名约定:方法后缀名应以 Async
结尾。

     (陆)别的:匿名情势和 Lambda
表明式也足以视作异步对象;async 是一个上下文关键字;关键字 async
必须在回来类型前。

 美高梅开户网址 31

图叁-一 异步方法的简约结构图

 

 三、What’s 异步方法

     异步方法:在实施到位前及时回到调用方法,在调用方法继续执行的历程中完毕职责。

     语法分析:

     (一)关键字:方法头使用 async
修饰。

     (2)须要:包蕴N(N>0) 个 await 表明式(不设有 await 表明式的话 IDE
会发出警告),表示须求异步执行的天职。

     (3)重回类型:只好回去 三种档次(void、Task 和 Task<T>)。Task 和 Task<T>
标识重回的对象会在未来成功工作,表示调用方法和异步方法能够继续执行。

     (4)参数:数量不限,但不可能利用 out 和 ref 关键字。

     (5)命名约定:方法后缀名应以 Async
结尾。

     (6)别的:匿超级模特式和 Lambda
表明式也足以视作异步对象;async 是叁个上下文关键字;关键字 async
必须在回来类型前。

 美高梅开户网址 32

图三-壹 异步方法的差不多结构图

 

二、async/await 结构

     先解析一下专业名词:    
 同步方法:一个主次调用有个别方法,等到其实施到位以往才进行下一步操作。这也是暗中同意的情势。
     异步方法:八个先后调用某些方法,在处理完了此前就回到该方法。通过
async/await 我们就足以兑现那种类型的艺术。        async/await
结构可分为3有个别:    
 (一)调用方法:该格局调用异步方法,然后在异步方法执行其义务的时候继续执行;
     (2)异步方法:该措施异步执行工作,然后立刻回到到调用方法;    
 (三)await
表达式:用于异步方法内部,建议供给异步执行的职责。多少个异步方法能够包含多少个await 表达式(不设有 await 表达式的话 IDE 会发出警告)。  
  未来大家来分析一下演示。   图二-一

 

二、async/await 结构

     先解析一下专业名词:

   
达成之后才进行下一步操作。那也是 异步方法:3个顺序调用有个别方法,在拍卖完了在此以前就重回该格局。通过
async/await 大家就足以兑现那种类型的办法。

 

     async/await 结构可分为3某些:

     (一)异步方法:该格局异步执行工作,然后随即回去到调用方法;

     (三)await
表达式:用于异步方法内部,提出要求异步执行的任务。3个异步方法能够包蕴四个await 表明式(不存在 await 表明式的话 IDE 会发出警告)。

 

  未来大家来分析一下演示。

美高梅开户网址 33

  图2-1

 

美高梅开户网址 ,小结

  一.解析了经过和线程的定义

  2.异步的大约用法

  3.async/await 结构体

  四.异步艺术语法结构

 

小结

  1.分析了经过和线程的定义

  二.异步的简便用法

  3.async/await 结构体

  四.异步艺术语法结构

 

 三、What’s 异步方法

   
 异步方法:在实践到位前及时回到调用方法,在调用方法继续执行的进度中完结职务。
     语法分析:      (1)关键字:方法头使用 async 修饰。    
 (贰)供给:包蕴 N(N>0) 个 await 表明式(不存在 await 表明式的话
IDE 会发出警示),表示要求异步执行的职分。      (3)重返类型:只可以回到
三 种档次(void、Task 和 Task<T>)。Task 和 Task<T>
标识重临的指标会在以往形成工作,表示调用方法和异步方法能够继续执行。    
 (四)参数:数量不限,但不能应用 out 和 ref 关键字。    
 (5)命名约定:方法后缀名应以 Async 结尾。      (六)其它:匿名格局和
拉姆da 表达式也得以当做异步对象;async 是四个上下文关键字;关键字 async
必须在回来类型前。  图3-一 异步方法的简练结构图

 

 三、What’s 异步方法

     异步方法:在实施到位前及时再次回到调用方法,在调用方法继续执行的长河中完毕职务。

     语法分析:

     (一)须求:包蕴 N(N>0) 个 await 表明式(不设有 await
表明式的话 IDE 会发出警示),表示需求异步执行的职务。

     (三)重返类型:只好回去 三类别型(void、Task 和 Task<T>)。Task 和 Task<T>
标识再次回到的指标会在前几日达成工作,表示调用方法和异步方法能够继续执行。

     (4)命名约定:方法后缀名应以 Async 结尾。

     (6)

图3-1 异步方法的粗略结构图

 

传送门

  下篇:《[走进异步编程的世界 –

传送门

  下篇:《[走进异步编程的世界 –

小结

  1.解析了经过和线程的概念

  二.异步的粗略用法

  3.async/await 结构体

  四.异步办匈牙利(Hungary)语法结构

 


正文首联:
–那是从头版本,待整治形成并核对后再重新公布到首页,望见谅!–

] 开头接触 async/await 异步编制程序, 初叶接触
async/await 异步编制程序 序 那是上学异步编制程序的入门篇。 目录 What’s 异步?
async/await 结构 Whats 异步…

小结

  一.分析了经过和线程的定义

  二.异步的简便用法

  3.async/await 结构体

  四.异步主意语法结构

 

分析异步方法(上)](

浅析异步方法(下)](

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

 


本文首联:

【参考】《Illustrated C# 2012》

浅析异步方法(上)](

分析异步方法(下)](

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

 


本文首联:

【参考】《Illustrated C# 2012》

传送门

  下篇:《异步编制程序 –
剖析异步方法》(预览版本正在整理中,待核查完再发布到首页)

 

   别的小说:《走进 LINQ
的世界》

 


正文首联:

 

  • 博客注定了是贰个抄袭与被抄袭,并且抄袭不表明出处的地点。
  • 只有创作,才能落得忘作者的程度。
  • 感激您的读书。喜欢的、有用的就请表哥四嫂们高抬贵手“推荐一下”吧!你的饱满支撑是博主强大的写作引力。
  • 由于博主的程度不高(其实是个菜B),不足和不当之处在所难免,希望大家可以批评建议。
  • 本身的博客:

 

分类: 01 【.NET
框架】, 0101
【C#】

标签: 异步

好文要顶;) 关注我;)
深藏该文;)
美高梅开户网址 34😉
美高梅开户网址 35😉

美高梅开户网址 36

反骨仔
关注 – 9
粉丝 – 84

 

 

+加关注;)

21

 

 

 

«上一篇:[C#]
异步编制程序 –
剖析异步方法

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图