威尼斯人线上娱乐

【威尼斯人线上娱乐】走进异步编制程序的世界,发轫接触

7 4月 , 2019  

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

 

走进异步编程的世界 – 开端接触 async/await

 

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

原稿链接:

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

【威尼斯人线上娱乐】走进异步编制程序的世界,发轫接触。  涉及 C# 伍.0 引进的 async/await,但在决定台出口示例时常常会使用 C#
陆.0 的 $”” 来拼接字符串,也就是string.Format() 方法。

 

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

  涉及 C# 5.0 引进的 async/await,但在决定台出口示例时平时会选择 C#
陆.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 异步?

     运维程序时,系统会在内存中开创一个新的过程。进度是组成运维程序财富的汇集。

     在经过之中,有号称线程的基石对象,它表示的是真的的举办顺序。系统会在 Main
方法的首先行语句就初始线程的推行。

 

     线程:

     一暗中同意动静,1个经过只包括三个线程,从程序的始发到实践完成;

   
 2线程能够派生自别的线程,所以八个经过能够蕴含分裂景色的两个线程,来实施顺序的例外部分;

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

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

 

   
 1般的话大家写的控制台程序都只利用了多少个线程,从第二条语句按梯次执行到最后一条。但在许多的事态下,这种简易的模子会在质量或用户体验上不好。

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

   
 以往大家初叶进入异步编程。在异步程序中,代码不须要听从编写时的依次执行。那时我们必要用到
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

     图一-壹 运营的服从图,以阿秒(ms)为单位

 

  【备注】一般的话,直接拼接字符串是1种相比耗质量的手腕,假诺对字符串拼接有品质供给的话应该选择StringBuilder。

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

 

威尼斯人线上娱乐 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

 图1-三 修改后的实施结果图

威尼斯人线上娱乐 6

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

 

  大家着眼时间轴发现,新版代码比旧版快了诸多(由于互连网波动的原故,很或者会现出耗费时间比此前长的处境)。这是由于
ExtraOperation 方法的数次调用是在
CountCharactersAsync 方法调用时等待响应的历程中开始展览的。全体的劳作都以在主线程中做到的,未有创建新的线程。

 

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

   威尼斯人线上娱乐 7

 图1-5

威尼斯人线上娱乐 8

  图1-6

 

  壹从 Main 方法执行到 CountCharactersAsync(一, url一)
方法时,该方法会霎时回去,然后才会调用它在那之中的艺术初叶下载内容。该格局重返的是2个Task<int>
类型的占位符对象,表示陈设展开的行事。那个占位符最后会回来 int
类型的值。

  2如此就能够不要等 CountCharactersAsync(1, url一)
方法执行到位就足以一而再拓展下一步操作。到实施 CountCharactersAsync(二,
url贰)  方法时,跟 一 一样再次来到 Task<int> 对象。

  3然后,Main 方法继续执行1回 ExtraOperation
方法,同时四回 CountCharactersAsync 方法依然在时时刻刻工作 。

  4t壹.Result 和 t二.Result 是指从 CountCharactersAsync 方法调用的
Task<int>
对象取结果,如若还未有结果的话,将卡住,直有结果重临截至。

 

一、What’s 异步?

     运行程序时,系统会在内部存款和储蓄器中开创一个新的经过。进度是结合运转程序财富的集结。

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

 

     线程:

     1暗中认可景观,三个历程只包涵1个线程,从程序的起来到实施完毕;

   
 2线程能够派生自另外线程,所以一个进程能够涵盖不相同意况的五个线程,来实施顺序的区别部分;

     叁三个进度中的八个线程,将共享该进程的能源;

     4系统为总括机执行所设计的单元是线程,而非进度。

 

   
 一般的话我们写的控制台程序都只使用了3个线程,从第一条语句按梯次执行到终极一条。但在广大的动静下,这种回顾的模型会在性质或用户体验上倒霉。

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

   
 未来大家开始进入异步编制程序。在异步程序中,代码不需求遵守编写时的依次执行。那时大家须要用到
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)为单位

 

  【备注】一般的话,间接拼接字符串是1种相比较耗品质的手腕,假如对字符串拼接有品质供给的话应该运用
StringBuilder。

  【注意】每一趟运转的结果恐怕两样。不管哪次调节和测试,绝当先五成时刻都浪费前两遍调用(CountCharacters
方法),即在等候网址的响应上。

 

威尼斯人线上娱乐 10

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

 

     有人曾幻想着这么进步质量的主意:在调用 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

 图壹-叁 修改后的推行结果图

威尼斯人线上娱乐 14

图一-四 依据参预异步后的施行结果画的大运轴。

 

  大家着眼时间轴发现,新版代码比旧版快了过多(由于互联网波动的原故,很恐怕会面世耗费时间比从前长的情况)。那是由于
ExtraOperation 方法的数10次调用是在
CountCharactersAsync 方法调用时等待响应的进度中举办的。全体的劳作都以在主线程中形成的,未有成立新的线程。

 

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

   威尼斯人线上娱乐 15

 图1-5

威尼斯人线上娱乐 16

  图1-6

 

  一从 Main 方法执行到 CountCharactersAsync(一, url1)
方法时,该方法会立刻再次来到,然后才会调用它里面包车型大巴艺术开首下载内容。该措施重临的是3个Task<int>
类型的占位符对象,表示安顿开始展览的做事。那些占位符最终会重临 int
类型的值。

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

  叁然后,Main 方法继续执行贰遍 ExtraOperation
方法,同时四回 CountCharactersAsync 方法依旧在时时刻刻工作 。

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

 

目录

  • What’s 异步?

  • async/await 结构

  • What’s 异步方法?

 

目录

  • What’s
    异步?

  • async/await
    结构

  • What’s
    异步方法?

 

二、async/await 结构

     先解析一下专业名词:

     同步方法:3个顺序调用某些方法,等到其履行到位以往才开始展览下一步操作。那也是私下认可的样式。

     异步方法:一个主次调用某些方法,在拍卖到位之前就回到该方法。通过
async/await 大家就足以兑现那类别型的主意。

 

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

     (壹)调用方法:该格局调用异步方法,然后在异步方法执行其职分的时候继续执行;

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

     (3)await
表明式:用于异步方法内部,提出须求异步执行的天职。一个异步方法能够涵盖多个await 表达式(不设有 await 表明式的话 IDE 会发出警示)。

 

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

威尼斯人线上娱乐 17

  图2-1

 

二、async/await 结构

     先解析一下专业名词:

     同步方法:一个程序调用某些方法,等到其推行到位之后才开始展览下一步操作。那也是暗中同意的款型。

     异步方法:一个顺序调用有个别方法,在拍卖实现在此以前就回到该格局。通过
async/await 大家就足以兑现这种类型的章程。

 

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

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

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

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

 

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

威尼斯人线上娱乐 18

  图2-1

 

一、What’s 异步?

   
 运转程序时,系统会在内存中开创三个新的进度。进度是结合运维程序财富的集纳。
   
 在经过之中,有号称线程的基础对象,它意味着的是真的的履行顺序。系统会在
Main 方法的首先行语句就伊始线程的施行。        线程:    
 (一)默许情形,二个经过只包涵3个线程,从程序的开始到执行完成;    
 (二)线程能够派生自别的线程,所以2个进度能够涵盖不一样情况的四个线程,来推行顺序的两样部分;
     (三)2个历程中的多少个线程,将共享该进度的能源;    
 (4)系统为总计机执行所设计的单元是线程,而非进度。      
 壹般的话大家写的控制台程序都只利用了一个线程,从第三条语句按梯次执行到结尾一条。但在众多的情景下,那种简易的模子会在质量或用户体验上不好。
   
 例如:服务器要同时处理来自三个客户端程序的请求,又要等待数据库和别的设备的响应。那将严重影响属性。程序不应有将时间浪费在响应上,而要在等待的还要推行别的任务!
   
 以后我们先河学习异步编制程序。在异步程序中,代码不须要根据编写时的顺序执行。那时我们供给用到
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     }

【注意】每一回运维的结果大概分歧。不管哪次调试,绝大部分时间都浪费前三次调用(CountCharacters
方法),即在等候网站的响应上。     图一-2 依照实施结果所画的年月轴

 

     有人曾幻想着这么升高品质的办法:在调用 A
方法时,不等它实施完,直接实施 B 方法,然后等 A 方法执行到位再处理。    
 C# 的 async/await 就足以允许大家如此弄。
威尼斯人线上娱乐 19 一 class
Program 2 { 3 //成立计时器 四 private static readonly Stopwatch 沃特ch =
new Stopwatch(); 五 陆 private static void Main(string[] args) 7 { 8
//运营计时器 玖 沃特ch.Start(); 10 11 const string url一 =
“”; 12 const string url2 =
“”; 一三 14 //两遍调用
CountCharactersAsync 方法(异步下载某网址内容,并计算字符的个数) 一伍Task<int> t一 = CountCharactersAsync(一, url壹); 1陆 Task<int>
t二 = CountCharactersAsync(二, url二); 一七 1八 //1遍调用 ExtraOperation
方法(主倘使经过拼接字符串达到耗费时间操作) 1玖 for (var i = 0; i < 三;
i++) 20 { 二一 ExtraOperation(i + 一); 2② } 2三 2肆 //控制台出口 25Console.WriteLine($”{url一} 的字符个数:{t一.Result}”); 26Console.WriteLine($”{url贰} 的字符个数:{t二.Result}”); 27 2捌Console.Read(); 29 } 30 3一 /// <summary> 32 /// 总括字符个数 33
/// </summary> 3四 /// <param name=”id”></param> 3五 ///
<param name=”address”></param> 3陆 ///
<returns></returns> 3七 private static async Task<int>
CountCharactersAsync(int id, string address) 3八 { 3九 var wc = new
WebClient(); 40 Console.WriteLine($”起首调用 id =
{id}:{Watch.ElapsedMilliseconds} ms”); 41 4贰 var result = await
wc.DownloadStringTaskAsync(address); 肆叁 Console.WriteLine($”调用完结 id
= {id}:{沃特ch.ElapsedMilliseconds} ms”); 44 45 return result.Length; 四陆} 四7 4八 /// <summary> 4玖 /// 额外操作 50 /// </summary> 51
/// <param name=”id”></param> 52 private static void
ExtraOperation(int id) 五三 { 54
//这里是因此拼接字符串举行部分相持耗费时间的操作 5伍 var s = “”; 56 五7 for
(var i = 0; i < 陆仟; i++) 5八 { 5九 s += i; 60 } 61 62
Console.WriteLine($”id = {id} 的 ExtraOperation
方法成功:{沃特ch.ElapsedMilliseconds} ms”); 陆三 } 6四 } 那是修改后的代码

 图壹-三 修改后的实践结果图

图一-四 依照参与异步后的履行结果画的小时轴。

 

  大家着眼时间轴发现,新版代码比旧版快了很多(由于网络波动的来由,很或许会产出耗费时间比在此以前长的气象)。那是由于
ExtraOperation 方法的数10遍调用是在
CountCharactersAsync 方法调用时等待响应的长河中举办的。全体的劳作都以在主线程中做到的,未有成立新的线程。
 
  【改动分析】只改了多少个细节的地方,直接开始展览代码的话大概看不出来,改动如下:
     图一-陆

 

  一从 Main 方法执行到 CountCharactersAsync(一, url一)
方法时,该方法会马上赶回,然后才会调用它在那之中的办法开头下载内容。该格局再次回到的是二个Task<int>
类型的占位符对象,表示安插开始展览的做事。那一个占位符最后会回去 int
类型的值。

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

  三然后,Main 方法继续执行三回 ExtraOperation
方法,同时一回 CountCharactersAsync 方法如故在时时刻刻工作 。

  四t1.Result 和 t贰.Result 是指从 CountCharactersAsync 方法调用的
Task<int>
对象取结果,假使还未曾结果的话,将封堵,直有结果重返截止。

 

一、What’s 异步?

   
 运维程序时,系统会在内部存款和储蓄器中创设三个新的经过。线程的根本对象,它表示的是真的的推行顺序。系统会在 Main
方法的首先行语句就起初线程的履行。

 

     线程:

     1暗许动静,3个经过只包括三个线程,从程序的始发到实践实现;

   
 二线程能够派生自此外线程,所以贰个历程能够包蕴不相同景观的多少个线程,来实施顺序的例外部分;

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

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

 

   
 一般的话大家写的控制台程序都只行使了三个线程,从第一条语句按顺序执行到最后一条。但在广大的图景下,那种简易的模子会在性质或用户体验上倒霉。

   
 例如:服务器要同时处理来自三个客户端程序的央浼,又要等待数据库和其余设备的响应,那将严重影响属性。程序不该将时间浪费在响应上,而要在等待的还要实施其它职务!

   
 将来我们起首进入异步编制程序。在异步程序中,代码不须要坚守编写时的相继执行。那时大家须求用到
C# 五.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。

  【注意】每一遍运转的结果可能两样。不管哪次调节和测试,绝超越10分之5时日都浪费前两遍调用(CountCharacters
方法),即在等候网站的响应上。

 

威尼斯人线上娱乐 23

  图一-2依照实施结果所画的时刻轴

 

     有人曾幻想着如此提升质量的法门:在调用 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

图1-四 遵照参与异步后的进行结果画的年华轴。

 

  我们观望时间轴发现,新版代码比旧版快了广大(由于互连网波动的缘故,很可能会现出耗费时间比从前长的情景)。这是出于
ExtraOperation 方法的多次调用是在
CountCharactersAsync 方法调用时等待响应的进度中展开的。全部的办事都以在主线程中成就的,未有开改进的线程。

 

  【改动分析】只改了多少个细节的位置,直接开展代码的话恐怕看不出来,改动如下:

   威尼斯人线上娱乐 29

 图1-5

威尼斯人线上娱乐 30

  图1-6

 

  壹从 Main 方法执行到 CountCharactersAsync(一, url壹)
方法时,该方法会即刻回到,然后才会调用它个中的措施伊始下载内容。该办法再次来到的是一个Task<int>
类型的占位符对象,表示安排实行的做事。那几个占位符最终会回到 int
类型的值。

  贰那样就能够不用等 CountCharactersAsync(1, url一)
方法执行到位就能够一连拓展下一步操作。到执行 CountCharactersAsync(二,
url二)  方法时,跟 1 1样重临 Task<int> 对象。

  三然后,Main 方法继续执行3次 ExtraOperation
方法,同时三回 CountCharactersAsync 方法还是在时时刻刻工作 。

  肆t1.Result 和 t2.Result 是指从 CountCharactersAsync 方法调用的
Task<int>
对象取结果,借使还从未结果的话,将封堵,直有结果重临截至。

 

 三、What’s 异步方法

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

     语法分析:

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

     (贰)须要:包涵N(N>0) 个 await 表明式(不存在 await 表达式的话 IDE
会发出警示),表示必要异步执行的职分。

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

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

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

     (六)其它:匿名情势和 拉姆da
表明式也足以当作异步对象;async 是贰个上下文关键字;关键字 async
必须在回到类型前。

 威尼斯人线上娱乐 31

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

 

 三、What’s 异步方法

     异步方法:在履行到位前及时回到调用方法,在调用方法继续执行的进度中形成职责。

     语法分析:

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

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

     (三)再次来到类型:只好回到 3系列型(void、Task 和 Task<T>)。Task 和 Task<T>
标识再次回到的目的会在将来完成工作,表示调用方法和异步方法能够继续执行。

     (四)参数:数量不限,但不能够使用 out 和 ref 关键字。

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

     (陆)其余:匿名形式和 Lambda
表明式也得以作为异步对象;async 是多少个上下文关键字;关键字 async
必须在回到类型前。

 威尼斯人线上娱乐 32

图三-一 异步方法的简要结构图

 

二、async/await 结构

     先解析一下专业名词:    
 同步方法:叁个程序调用有些方法,等到其推行到位之后才开始展览下一步操作。这也是暗中同意的款式。
     异步方法:三个主次调用有个别方法,在拍卖完了在此以前就重返该方法。通过
async/await 我们就足以兑现那连串型的措施。        async/await
结构可分为三有的:    
 (一)调用方法:该情势调用异步方法,然后在异步方法执行其任务的时候继续执行;
     (二)异步方法:该办法异步执行工作,然后立即回去到调用方法;    
 (叁)await
表达式:用于异步方法内部,提议供给异步执行的任务。三个异步方法能够分包多少个await 表达式(不存在 await 表明式的话 IDE 会发出警告)。  
  今后我们来分析一下演示。   图贰-一

 

二、async/await 结构

     先解析一下专业名词:

   
完结未来才举办下一步操作。那也是 异步方法:三个顺序调用有个别方法,在拍卖到位在此以前就回去该措施。通过
async/await 大家就足以兑现那类别型的措施。

 

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

     (1)异步方法:该办法异步执行工作,然后马上回去到调用方法;

     (3)await
表明式:用于异步方法内部,提议必要异步执行的职务。一个异步方法能够分包三个await 表达式(不存在 await 表明式的话 IDE 会发出警示)。

 

  未来我们来分析一下示范。

威尼斯人线上娱乐 33

  图2-1

 

小结

  壹.剖析了经过和线程的定义

  2.异步的简便用法

  3.async/await 结构体

  四.异步主意语法结构

 

小结

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

  二.异步的不难用法

  3.async/await 结构体

  4.异步主意语法结构

 

 3、What’s 异步方法

   
 异步方法:在履行到位前及时再次来到调用方法,在调用方法继续执行的进度中成就职责。
     语法分析:      (一)关键字:方法头使用 async 修饰。    
 (贰)供给:包含 N(N>0) 个 await 表达式(不存在 await 表明式的话
IDE 会发出警示),表示要求异步执行的职责。      (三)再次来到类型:只可以回到
三 种档次(void、Task 和 Task<T>)。Task 和 Task<T>
标识重返的靶子会在今天达成工作,表示调用方法和异步方法能够继续执行。    
 (四)参数:数量不限,但不能选取 out 和 ref 关键字。    
 (5)命名约定:方法后缀名应以 Async 结尾。      (陆)别的:匿有名的模特式和
拉姆da 表明式也得以作为异步对象;async 是贰个上下文关键字;关键字 async
必须在再次来到类型前。  图三-① 异步方法的简约结构图

 

 叁、What’s 异步方法

     异步方法:在履行到位前及时回去调用方法,在调用方法继续执行的进程中形成职分。

     语法分析:

     (壹)要求:包罗 N(N>0) 个 await 表明式(不存在 await
表明式的话 IDE 会发出警告),表示需求异步执行的任务。

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

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

     (6)

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

 

传送门

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

传送门

威尼斯人线上娱乐 ,  下篇:《[走进异步编制程序的社会风气 –

小结

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

  二.异步的简练用法

  3.async/await 结构体

  4.异步格局语法结构

 


正文首联:
–那是伊始版本,待整治形成并核对后再重复发表到首页,望见谅!–

] 开始接触 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地图