始发接触,异步编制程序

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

 

走进异步编制程序的世界 – 起首接触 async/await

 

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

初稿链接:

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

  涉及 C# 5.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# 5.0 引入的 async/await,但在支配台出口示例时日常会利用 C#
6.0 的 $”” 来拼接字符串,相当于string.Format() 方法。

 

一、What’s 异步?

     运营程序时,系统会在内部存储器中开创二个新的历程。进度是整合运维程序能源的汇集。

     在经过之中,有号称线程的基石对象,它表示的是真正的实践顺序。系统会在 Main
方法的第2行语句就开头线程的实行。

 

     线程:

     1暗许气象,1个经过只包蕴二个线程,从程序的初步到实践完成;

   
 贰线程能够派生自其余线程,所以三个历程能够包含不一致情形的四个线程,来推行顺序的不如部分;

     33个进度中的五个线程,将共享该进程的财富;

     肆种类为电脑执行所安排的单元是线程,而非进程。

 

   
 一般的话大家写的控制台程序都只行使了2个线程,从第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     }

亚洲必赢官网 1

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

 

  【备注】一般的话,直接拼接字符串是1种相比耗品质的手腕,借使对字符串拼接有总体性供给的话应该运用
StringBuilder。

  【注意】每回运营的结果只怕两样。不管哪次调节和测试,绝超越60%时刻都浪费前五次调用(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

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

亚洲必赢官网 6

图1-四 依照加入异步后的实践结果画的命宫轴。

 

  我们着眼时间轴发现,新版代码比旧版快了无数(由于互连网波动的原委,很只怕会出现耗费时间比之前长的情景)。这是由于
ExtraOperation 方法的多次调用是在
CountCharactersAsync 方法调用时等待响应的进度中开始展览的。全体的劳作都以在主线程中做到的,未有创立新的线程。

 

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

   亚洲必赢官网 7

 图1-5

亚洲必赢官网 8

  图1-6

 

  壹从 Main 方法执行到 CountCharactersAsync(一, url1)
方法时,该方法会立刻回去,然后才会调用它当中的不二等秘书诀开端下载内容。该措施再次回到的是三个Task<int>
类型的占位符对象,表示安插展开的行事。这些占位符最后会回来 int
类型的值。

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

  三然后,Main 方法继续执行2次 ExtraOperation
方法,同时一次 CountCharactersAsync 方法仍旧在相连工作 。

  四t一.Result 和 t二.Result 是指从 CountCharactersAsync 方法调用的
Task<int>
对象取结果,尽管还未曾结果的话,将卡住,直有结果再次来到截至。

 

一、What’s 异步?

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

     在经过之中,有号称线程的基业对象,它表示的是真正的履行顺序。系统会在 Main
方法的第三行语句就初步线程的施行。

 

     线程:

     1暗中认可动静,3个进度只含有3个线程,从程序的起来到实施达成;

   
 贰线程能够派生自别的线程,所以贰个经过能够涵盖分化景观的八个线程,来实施顺序的例外部分;

     31个经过中的多个线程,将共享该进程的能源;

     肆种类为计算机执行所陈设的单元是线程,而非进程。

 

   
 一般的话大家写的控制台程序都只使用了二个线程,从第贰条语句按顺序执行到结尾一条。但在不少的图景下,这种不难的模型会在性质或用户体验上不佳。

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

   
 将来大家先导进入异步编程。在异步程序中,代码不供给根据编写时的各类执行。那时大家必要用到
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

     图一-一 运行的机能图,以微秒(ms)为单位

 

  【备注】一般的话,直接拼接字符串是壹种相比耗品质的手段,假若对字符串拼接有总体性供给的话应该利用
StringBuilder。

  【注意】每一遍运营的结果大概不一致。不管哪次调节和测试,绝抢先八分之四时刻都浪费前四遍调用(CountCharacters
方法),即在等候网址的响应上。

 

亚洲必赢官网 10

  图1-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 方法的数十次调用是在
CountCharactersAsync 方法调用时等待响应的经过中举行的。全体的办事都以在主线程中形成的,未有开创新的线程。

 

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

   亚洲必赢官网 15

 图1-5

亚洲必赢官网 16

  图1-6

 

  一从 Main 方法执行到 CountCharactersAsync(一, url壹)
方法时,该方法会马上再次回到,然后才会调用它里面包车型大巴不二等秘书诀起头下载内容。该措施重返的是二个Task<int>
类型的占位符对象,表示安插开始展览的做事。这几个占位符最后会重返 int
类型的值。

  2这么就足以不用等 CountCharactersAsync(一, url一)
方法执行到位就能够三番六回拓展下一步操作。到执行 CountCharactersAsync(贰,
url2)  方法时,跟 一 1样重临 Task<int> 对象。

  ③然后,Main 方法继续执行2回 ExtraOperation
方法,同时五遍 CountCharactersAsync 方法如故在时时刻刻工作 。

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

 

目录

  • What’s 异步?

  • async/await 结构

  • What’s 异步方法?

 

目录

  • What’s
    异步?

  • async/await
    结构

  • What’s
    异步方法?

 

二、async/await 结构

     先解析一下专业名词:

     同步方法:多少个程序调用某些方法,等到其实践到位之后才开始展览下一步操作。那也是默许的款型。

     异步方法:1个先后调用有些方法,在处理到位此前就回到该格局。通过
async/await 我们就能够完结那连串型的不二秘籍。

 

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

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

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

     (三)await
表明式:用于异步方法内部,建议需求异步执行的任务。三个异步方法能够涵盖八个await 表达式(不存在 await 表明式的话 IDE 会发出警示)。

 

  现在我们来分析一下示范。

亚洲必赢官网 17

  图2-1

 

二、async/await 结构

     先解析一下专业名词:

     同步方法:三个主次调用有些方法,等到其实施到位以往才举办下一步操作。那也是暗中同意的款型。

     异步方法:二个程序调用有个别方法,在处理完结在此以前就回到该措施。通过
async/await 我们就能够兑现那体系型的情势。

 

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

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

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

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

 

  将来大家来分析一下示范。

亚洲必赢官网 18

  图2-1

 

一、What’s 异步?

   
 运维程序时,系统会在内部存款和储蓄器中开创3个新的进程。进度是整合运维程序财富的集聚。
   
 在进度之中,有号称线程的木本对象,它象征的是确实的施行顺序。系统会在
Main 方法的第2行语句就开首线程的实施。        线程:    
 (一)默许情形,1个进度只含有3个线程,从程序的启幕到执行实现;    
 (二)线程可以派生自其余线程,所以多个历程能够分包不相同意况的多个线程,来进行顺序的两样部分;
     (三)2个经过中的几个线程,将共享该进程的能源;    
 (4)系统为电脑执行所铺排的单元是线程,而非进度。      
 一般的话我们写的控制台程序都只利用了二个线程,从第贰条语句按顺序执行到终极一条。但在很多的情事下,那种简易的模型会在性质或用户体验上倒霉。
   
 例如:服务器要同时处理来自多少个客户端程序的请求,又要等待数据库和其余设备的响应。那将严重影响属性。程序不应有将时刻浪费在响应上,而要在伺机的同时施行别的职责!
   
 今后我们开头攻读异步编制程序。在异步程序中,代码不须求依据编写时的逐1执行。那时大家须要用到
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
方法),即在等候网址的响应上。     图1-2 依照实施结果所画的时刻轴

 

     有人曾幻想着这么升高性能的章程:在调用 A
方法时,不等它执行完,间接执行 B 方法,然后等 A 方法执行到位再处理。    
 C# 的 async/await 就足以允许大家如此弄。
亚洲必赢官网 19 一 class
Program 二 { 3 //创立计时器 4 private static readonly Stopwatch 沃特ch =
new Stopwatch(); 伍 六 private static void Main(string[] args) 7 { 8
//运转计时器 玖 沃特ch.Start(); 拾 11 const string url1 =
“”; 12 const string url2 =
“”; 一三 14 //两回调用
CountCharactersAsync 方法(异步下载某网址内容,并总结字符的个数) 一5Task<int> t一 = CountCharactersAsync(①, url一); 1陆 Task<int>
t2 = CountCharactersAsync(2, url二); 1七 1捌 //贰次调用 ExtraOperation
方法(首借使通过拼接字符串达到耗费时间操作) 1九 for (var i = 0; i < 3;
i++) 20 { 二一 ExtraOperation(i + 壹); 2二 } 二叁 贰四 //控制台出口 二5Console.WriteLine($”{url1} 的字符个数:{t一.Result}”); 2六Console.WriteLine($”{url二} 的字符个数:{t二.Result}”); 2七 2八Console.Read(); 2九 } 30 3一 /// <summary> 32 /// 总括字符个数 33
/// </summary> 3四 /// <param name=”id”></param> 3伍 ///
<param name=”address”></param> 3六 ///
<returns></returns> 三七 private static async Task<int>
CountCharactersAsync(int id, string address) 3八 { 39 var wc = new
WebClient(); 40 Console.WriteLine($”起始调用 id =
{id}:{沃特ch.Elapsed米尔iseconds} ms”); 四一 4二 var result = await
wc.DownloadStringTaskAsync(address); 四三 Console.WriteLine($”调用实现 id
= {id}:{沃特ch.ElapsedMilliseconds} ms”); 4四 四五 return result.Length; 4陆} 47 4八 /// <summary> 4玖 /// 额外操作 50 /// </summary> 51
/// <param name=”id”></param> 5贰 private static void
ExtraOperation(int id) 5三 { 54
//那里是因此拼接字符串举行一些针锋相对耗费时间的操作 5伍 var s = “”; 56 五7 for
(var i = 0; i < 5000; i++) 5八 { 5玖 s += i; 60 } 陆壹 62
Console.WriteLine($”id = {id} 的 ExtraOperation
方法成功:{沃特ch.ElapsedMilliseconds} ms”); 陆3 } 6四 } 那是修改后的代码

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

图1-4 依照参加异步后的实施结果画的光阴轴。

 

  大家观望时间轴发现,新版代码比旧版快了累累(由于网络波动的缘故,很只怕会出现耗费时间比以前长的情况)。那是由于
ExtraOperation 方法的数十次调用是在
CountCharactersAsync 方法调用时等待响应的进度中开始展览的。全体的行事都以在主线程中成功的,未有创立新的线程。
 
  【改动分析】只改了多少个细节的地点,直接开始展览代码的话可能看不出来,改动如下:
     图1-陆

 

  壹从 Main 方法执行到 CountCharactersAsync(一, url一)
方法时,该方法会即刻回去,然后才会调用它在那之中的章程伊始下载内容。该情势重返的是一个Task<int>
类型的占位符对象,表示布署开始展览的劳作。这些占位符最终会回来 int
类型的值。

  贰这么就能够不要等 CountCharactersAsync(一, url1)
方法执行到位就足以三番五遍实行下一步操作。到执行 CountCharactersAsync(二,
url2)  方法时,跟 壹 一样重返 Task<int> 对象。

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

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

 

一、What’s 异步?

   
 运营程序时,系统会在内部存款和储蓄器中创造一个新的历程。线程的基石对象,它表示的是当真的施行顺序。系统会在 Main
方法的率先行语句就起来线程的实施。

 

     线程:

     壹私下认可意况,1个经过只包蕴三个线程,从程序的初步到执行达成;

   
 贰线程能够派生自此外线程,所以二个历程能够分包分歧景色的五个线程,来进行顺序的差异部分;

     叁二个历程中的多少个线程,将共享该进程的资源;

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

 

   
 壹般的话我们写的控制台程序都只行使了贰个线程,从第3条语句按梯次执行到最后一条。但在重重的情景下,这种归纳的模子会在品质或用户体验上不佳。

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

   
 现在大家开首进入异步编程。在异步程序中,代码不需求遵守编写时的逐条执行。那时大家供给用到
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

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

亚洲必赢官网 28

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

 

  我们着眼时间轴发现,新版代码比旧版快了成都百货上千(由于互联网波动的缘由,很可能会并发耗费时间比以前长的情事)。那是由于
ExtraOperation 方法的数次调用是在
CountCharactersAsync 方法调用时等待响应的进度中展开的。全数的工作都以在主线程中实现的,未有创建新的线程。

 

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

   亚洲必赢官网 29

 图1-5

亚洲必赢官网 30

  图1-6

 

  壹从 Main 方法执行到 CountCharactersAsync(一, url壹)
方法时,该方法会霎时回到,然后才会调用它里面包车型客车法子开头下载内容。该方法重回的是1个Task<int>
类型的占位符对象,表示安插开始展览的劳作。那几个占位符最终会回到 int
类型的值。

  二那样就能够不必等 CountCharactersAsync(一, url一)
方法执行到位就足以继续开始展览下一步操作。到执行 CountCharactersAsync(二,
url二)  方法时,跟 1 1样重返 Task<int> 对象。

  3然后,Main 方法继续执行2次 ExtraOperation
方法,同时四次 CountCharactersAsync 方法如故在不断工作 。

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

 

 3、What’s 异步方法

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

     语法分析:

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

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

     (三)再次来到类型:只可以回到 三种档次(void、Task 和 Task<T>)。Task 和 Task<T>
标识重临的指标会在未来形成工作,表示调用方法和异步方法能够继续执行。

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

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

     (6)别的:匿名形式和 拉姆da
表达式也得以看作异步对象;async 是3个上下文关键字;关键字 async
必须在回来类型前。

 亚洲必赢官网 31

图三-1 异步方法的简单结构图

 

 3、What’s 异步方法

     异步方法:在实践到位前及时回去调用方法,在调用方法继续执行的进度中完毕职务。

     语法分析:

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

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

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

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

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

     (六)其余:匿名格局和 拉姆da
表明式也能够看作异步对象;async 是三个上下文关键字;关键字 async
必须在回去类型前。

 亚洲必赢官网 32

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

 

二、async/await 结构

     先解析一下专业名词:    
 同步方法:一个先后调用有个别方法,等到其执行到位之后才进行下一步操作。这也是私下认可的花样。
     异步方法:五个顺序调用有些方法,在拍卖实现从前就回到该形式。通过
async/await 大家就足以兑现那种类型的方法。        async/await
结构可分为三有的:    
 (一)调用方法:该措施调用异步方法,然后在异步方法执行其职务的时候继续执行;
     (二)异步方法:该方法异步执行工作,然后霎时回到到调用方法;    
 (三)await
表明式:用于异步方法内部,提出须求异步执行的职务。2个异步方法能够分包四个await 表达式(不存在 await 表明式的话 IDE 会发出警示)。  
  未来我们来分析一下示范。   图贰-一

 

二、async/await 结构

     先解析一下专业名词:

   
完成之后才开始展览下一步操作。那也是 异步方法:多个程序调用有个别方法,在处理到位从前就回去该措施。通过
async/await 咱们就能够实现那体系型的法子。

 

     async/await 结构可分为叁有的:

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

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

 

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

亚洲必赢官网 33

  图2-1

 

小结

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

  二.异步的简单用法

  3.async/await 结构体

  四.异步格局语法结构

 

小结

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

  ②.异步的简要用法

  3.async/await 结构体

  4.异步方式语法结构

 

 三、What’s 异步方法

   
 异步方法:在实践到位前及时重返调用方法,在调用方法继续执行的进度中完结义务。
     语法分析:      (一)关键字:方法头使用 async 修饰。    
 (二)供给:包括 N(N>0) 个 await 表明式(不存在 await 表明式的话
IDE 会发出警示),表示供给异步执行的职责。      (三)重返类型:只可以回去
三 种档次(void、Task 和 Task<T>)。Task 和 Task<T>
标识再次回到的对象会在以后成功工作,表示调用方法和异步方法能够继续执行。    
 (肆)参数:数量不限,但不能动用 out 和 ref 关键字。    
 (5)命名约定:方法后缀名应以 Async 结尾。      (陆)此外:匿名方式和
兰姆da 表达式也足以用作异步对象;async 是三个上下文关键字;关键字 async
必须在再次来到类型前。  图三-一 异步方法的总结结构图

 

 3、What’s 异步方法

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

     语法分析:

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

     (3)再次来到类型:只好回到 三种档次(void、Task 和 Task<T>)。Task 和 Task<T>
标识再次回到的靶子会在今后实现工作,表示调用方法和异步方法可以继续执行。

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

     (6)

图三-① 异步方法的简练结构图

 

传送门

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

传送门

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

小结

  一.剖析了经过和线程的概念

  二.异步的归纳用法

  3.async/await 结构体

  肆.异步方式语法结构

 


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

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