澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站的异步编制程序

选取 async & await 的异步编制程序

【博主】反骨仔    【出处】   

动用 async & await 的异步编制程序

【博主】反骨仔    【出处】   

[.NET] 利用 async & await 的异步编制程序,.net利用async

总的来看Microsoft官方一篇有关异步编制程序的作品,认为相当好,不敢独享,共享给大家。

见到Microsoft官方一篇有关异步编制程序的小说,认为非常好,不敢独享,分享给我们。

目录

  • 异步编制程序的简要介绍
  • 异步升高响应技能
  • 更便于编写的异步方法
  • 异步方法的调控流(核心)
  • 异步中的线程
  • async 和 await 修饰符
  • 再次回到类型和参数消息
  • 命名的约定

 

目录

  • 异步编制程序的简单介绍
  • 异步提升响应本领
  • 更便于编写的异步方法
  • 异步方法的调整流澳门新浦京娱乐场网站,(核心)
  • 异步中的线程
  • async 和 await 修饰符
  • 回到类型和参数信息
  • 命名的预订

 

选用 async & await 的异步编制程序

【博主】反骨仔    【出处】   

初稿地址:

初稿地址:

一、异步编制程序的简要介绍

  通过动用异步编制程序,你能够幸免质量瓶颈并坚实你的应用程序的完好响应技术。

  从 VS 二〇一二 起首,新引进了二个简化的方法,称为异步编制程序。大家在 >= .NET 4.5 如月 Windows 运维时中使用异步,编写翻译器它会援救了我们减少了早就举行的高难度异步代码编写的职业,但逻辑结构却就如于一块代码。由此,我们仅须求实行一小部分编制程序的劳作就可以获得异步编制程序的具有优点。

 

一、异步编制程序的简要介绍

  通过行使异步编制程序,你可防止止品质瓶颈并坚实你的应用程序的一体化响应技艺。

  从 VS 二零一一 开首,新引进了一个简化的章程,称为异步编制程序。大家在 >= .NET 4.5 杏月 Windows 运维时中采纳异步,编写翻译器它会辅助了大家减弱了曾经实行的高难度异步代码编写的办事,但逻辑结构却周边于一块代码。因而,大家仅需求举办一小部分编程的做事就足以拿走异步编制程序的有所优点。

 

目录

  • 异步编制程序的简单介绍
  • 异步提升响应手艺
  • 更便于编写的异步方法
  • 异步方法的调节流(核心)
  • 线程
  • async 和 await
  • 回来类型和参数消息
  • 命名的约定

 

透过动用异步编制程序,你能够幸免品质瓶颈并抓牢应用程序的完整响应技能。 不过,编写异步应用程序的观念技巧大概相比复杂,使它们难以编写、调节和测量检验和保卫安全。

通过运用异步编制程序,你能够免止品质瓶颈并巩固应用程序的完整响应本事。 可是,编写异步应用程序的观念意识技巧或许比较复杂,使它们难以编写、调节和测验和维护。

二、异步升高响应工夫

  异步对恐怕孳生短路的运动(如访谈Web 时),对 Web 能源的拜访一时过慢或延迟过高。若这种职责在一块儿进度中受阻,则全体应用程序必需等待响应完结。 在使用异步的历程中,我们的应用程序可继续实践不相信赖Web 财富的另外干活,并会平素等候绿灯的任务顺遂实现。

  这是有的卓越的运用异步的运用场景,以及部分在 .NET >= 4.5 后新添的类库。

澳门新浦京娱乐场网站 1

  全数与客户分界面相关的操作日常分享四个线程,所以使用异步对于使用 UI 线程的 App 来说是分外重大的。

  纵然说你的 App 全数操作都以联合的,也正是说,当一个线程出现堵塞,别的线程都会师世堵塞,更要紧的是, App 会甘休响应。

澳门新浦京娱乐场网站 2

 

  使用异步方法时,App 将承继响应 UI。如:最大和最小化,不过意义仍然在后台实行(如:下载)。

 

二、异步进步响应技能

  异步对大概引起短路的运动(如访问Web 时),对 Web 资源的拜会偶尔过慢或延迟过高。若这种职务在一起进度中受阻,则整个应用程序必需等待响应达成。 在行使异步的历程中,大家的应用程序可继续实施不信赖Web 财富的别的工作,并会直接守候绿灯的职分顺遂达成。

  那是一些规范的利用异步的利用场景,以及一些在 .NET >= 4.5 后新扩张的类库。

澳门新浦京娱乐场网站 3

  全数与客户分界面相关的操作常常分享一个线程,所以利用异步对于利用 UI 线程的 App 来讲是特别关键的。

  即便说你的 App 全数操作都是一道的,也正是说,当三个线程出现堵塞,别的线程都会产出堵塞,更要紧的是, App 会结束响应。

澳门新浦京娱乐场网站 4

 

  使用异步方法时,App 将一连响应 UI。如:最大和最小化,可是效果依旧在后台施行(如:下载)。

 

一、异步编制程序的简单介绍

  通过动用异步编制程序,你能够幸免品质瓶颈并加强应用程序的完整响应技巧。

  Visual Studio 二零一三 引进了二个简化的不二诀窍,异步编制程序,在 .NET Framework 4.5 和 Windows 运转时选择异步协理。编写翻译器可推行开采人士曾张开的高难度专门的学问,且应用程序保留了贰个临近于一块代码的逻辑结构。因而,您仅需求实行一小部分行事就足以获取异步编制程序的全数优点。

 

Visual Studio 二零一一 引进了叁个简化的情势(即异步编程),该方式应用 .NET Framework 4.5 和 Windows 运转时中的异步援助。 编写翻译器可举办开荒人士曾开展的高难度工作,且应用程序保留了叁个好像于联合代码的逻辑结构。 由此,你只需做一小部分专门的学问就足以赢得异步编程的具有好处。

Visual Studio 贰零壹壹 引进了几个简化的格局(即异步编制程序),该措施应用 .NET Framework 4.5 和 Windows 运行时中的异步扶助。 编译器可实行开荒职员曾展开的高难度职业,且应用程序保留了三个像样于一块代码的逻辑结构。 因而,你只需做一小部分职业就能够获得异步编程的兼具好处。

三、更易于编写的异步方法

  C# 中的 async 和 await 关键字都以异步编制程序的主导。通过利用那多少个至关心尊敬要字,大家就足以在 .NET 轻便创制异步方法。

  示例:

 1         /// <summary>
 2         /// 异步访问 Web 
 3         /// </summary>
 4         /// <returns></returns>
 5         /// <remarks>
 6         /// 方法签名的 3 要素:
 7         ///     ① async 修饰符
 8         ///     ② 返回类型 Task 或 Task<TResult>:这里的 Task<int> 表示 return 语句返回 int 类型
 9         ///     ③ 方法名以 Async 结尾
10         /// </remarks>
11         async Task<int> AccessTheWebAsync()
12         {
13             //记得 using System.Net.Http 哦
14             var client = new HttpClient();
15 
16             //执行异步方法 GetStringAsync
17             Task<string> getStringTask = client.GetStringAsync("http://www.google.com.hk/");
18 
19             //假设在这里执行一些非异步的操作
20             Do();
21 
22             //等待操作挂起方法 AccessTheWebAsync
23             //直到 getStringTask 完成,AccessTheWebAsync 方法才会继续执行
24             //同时,控制将返回到 AccessTheWebAsync 方法的调用方
25             //直到 getStringTask 完成后,将在这里恢复控制。
26             //然后从 getStringTask 拿到字符串结果
27             string urlContents = await getStringTask;
28 
29             //返回字符串的长度(int 类型)
30             return urlContents.Length;
31         }

 

  假设 AccessTheWebAsync 在调用 GetStringAsync() 时未有别的操作(如:代码中的 Do()),你能够用如此的秘技来简化代码。

string urlContents = await client.GetStringAsync("http://www.google.com.hk/");

  

  轻便总计:

  (1)方法签字包涵一个 async 修饰符。

  (2)依据预约,异步方法的名称需要以“Async”后缀为尾声。

  (3)3 种回到类型:

    ① Task<TResult>:返回 TResult 类型。

    ② Task:未有重返值,即重返值为 void。

    ③ void:只适用于异步事件管理程序。

  (4)方法日常包蕴起码三个await 表明式,该表明式标识五个点,大家可以改为悬挂点,在该点上,直到等待的异步操作实现,之后的秘技技巧继续实践。 与此同一时间,该方法将挂起,并将调整权再次来到到艺术的调用方。

  

  须求动用异步方法的话,大家一贯在系统之中使用所提供的基本点字 async 和 await 就足以了,剩余的别的事情,就留下编写翻译器吧。 

 

三、更易于编写的异步方法

  C# 中的 async 和 await 关键字都是异步编制程序的基本。通过使用那七个根本字,我们就足以在 .NET 轻巧成立异步方法。

  示例:

 1         /// <summary>
 2         /// 异步访问 Web 
 3         /// </summary>
 4         /// <returns></returns>
 5         /// <remarks>
 6         /// 方法签名的 3 要素:
 7         ///     ① async 修饰符
 8         ///     ② 返回类型 Task 或 Task<TResult>:这里的 Task<int> 表示 return 语句返回 int 类型
 9         ///     ③ 方法名以 Async 结尾
10         /// </remarks>
11         async Task<int> AccessTheWebAsync()
12         {
13             //记得 using System.Net.Http 哦
14             var client = new HttpClient();
15 
16             //执行异步方法 GetStringAsync
17             Task<string> getStringTask = client.GetStringAsync("http://www.google.com.hk/");
18 
19             //假设在这里执行一些非异步的操作
20             Do();
21 
22             //等待操作挂起方法 AccessTheWebAsync
23             //直到 getStringTask 完成,AccessTheWebAsync 方法才会继续执行
24             //同时,控制将返回到 AccessTheWebAsync 方法的调用方
25             //直到 getStringTask 完成后,将在这里恢复控制。
26             //然后从 getStringTask 拿到字符串结果
27             string urlContents = await getStringTask;
28 
29             //返回字符串的长度(int 类型)
30             return urlContents.Length;
31         }

 

  如若 AccessTheWebAsync 在调用 GetStringAsync() 时未有任何操作(如:代码中的 Do()),你能够用这么的点子来简化代码。

string urlContents = await client.GetStringAsync("http://www.google.com.hk/");

  

  轻松计算:

  (1)方法签字满含贰个 async 修饰符。

  (2)根据预订,异步方法的名号必要以“Async”后缀为最后。

  (3)3 种回到类型:

    ① Task<TResult>:返回 TResult 类型。

    ② Task:未有重临值,即重返值为 void。

    ③ void:只适用于异步事件管理程序。

  (4)方法常常蕴涵起码三个await 表明式,该表达式标识一个点,大家能够形成悬挂点,在该点上,直到等待的异步操作实现,之后的点子才干继续推行。 与此同期,该措施将挂起,并将调节权再次来到到情势的调用方。

  

  要求选用异步方法的话,大家直接在系统里面选取所提供的基本点字 async 和 await 就能够了,剩余的别样业务,就留给编写翻译器吧。 

 

二、异步提升响应技巧

  异步对也许引起短路的运动(举例应用程序访问Web 时)至关心器重要。对 Web 能源的探问一时极慢或会推迟。假如此类活动在联合进度中受阻,则整个应用程序必得等待。 在异步进度中,应用程序可继续试行不重视Web 财富的别的干活,直至潜在阻塞的职分达成。

  下图彰显了异步编制程序提升响应技能的出色应用场景。满含从 .NET Framework 4.5 和 Windows 运维时中列出的一些带有帮助异步编制程序的点子的类。

  由于有着与客商分界面相关的活动日常分享二个线程,由此,异步对拜会UI 线程的应用程序来讲尤为重大。 假诺在二个同步应用程序中有任何的线程被堵塞了,那么具有线程都将被封堵,再严重一点,你的应用程序将会告一段落响应。

  使用异步方法时,应用程序将继续响应 UI。比方,你可以调动窗口的大大小小或最小化窗口;假若你不期望等待应用程序甘休,则能够将其倒闭。

 

本宗旨概述了何时以及怎样运用异步编制程序,并满含针对包罗详细音信和演示的辅助主旨的链接。

本主旨概述了何时以及如何运用异步编制程序,并包蕴针对包罗详细音讯和演示的支撑核心的链接。

四、异步方法的调节流(大旨)

  异步编制程序中最首要却不易懂的是调控流,即分歧格局间的切换。未来,请用一颗感恩的心来察看下图。

澳门新浦京娱乐场网站 5

  步骤剖判:

  ① 事件管理程序调用并伺机 AccessTheWebAsync() 异步方法。

  ② AccessTheWebAsync 创造 HttpClient 对象并调用它的 GetStringAsync 异步方法来下载网址内容。

  ③ 要是 GetStringAsync 中爆发了某种情况,该情状挂起了它的长河。恐怕必得等待网址下载或部分别的阻塞的活动。为防止阻塞财富,GetStringAsync() 会将调整权出让给其调用方 AccessTheWebAsync。GetStringAsync 再次来到 Task,个中 TResult 为字符串,并且 AccessTheWebAsync 将职责分配给 getStringTask 变量。该任务表示调用 GetStringAsync 的正在拓宽的进度,当中承诺当专业产生时发生实际字符串值。

  ④ 由于并未有等待 getStringTask,因而,AccessTheWebAsync 能够继续实行不借助于 GetStringAsync 得出最终结出的任何职分。该职务由对一齐方法 DoIndependentWork 的调用表示。

  ⑤ DoIndependentWork 是做到其行事并再次来到其调用方的联合方法。

  ⑥ AccessTheWebAsync 已到位职业,能够不受 getStringTask 的结果影响。 接下来,AccessTheWebAsync 供给计算并赶回该下载字符串的长短,但该措施仅在具有字符串时技术计算该值。由此,AccessTheWebAsync 使用三个 await 运算符来挂起其速度,并把调控权交给调用 AccessTheWebAsync 的秘诀。AccessTheWebAsync 将 Task<int> 再次来到至调用方。 该职务表示对发出下载字符串长度的整数结果的多少个承诺。

  【备注】假使 GetStringAsync(即 getStringTask)在 AccessTheWebAsync 等待前形成,则调控权会保留在 AccessTheWebAsync 中。 假若异步调用过程(getStringTask) 已到位,况兼 AccessTheWebSync 不必等待最终结果,则挂起接下来回来到 AccessTheWebAsync,但那会导致资金的荒疏。

  在调用方内部(假如那是五个事件处理程序),管理格局将继承。在伺机结果前,调用方能够张开不借助于 AccessTheWebAsync 结果的任何干活,不然就需等候片刻。事件管理程序等待 AccessTheWebAsync,而 AccessTheWebAsync 等待 GetStringAsync。

  ⑦ GetStringAsync 完毕并生成八个字符串结果。 字符串结果不是由此你预期的法门调用 GetStringAsync 所重临的。(请牢记,此措施已在步骤 3 中回到一个职务。)相反,字符串结果存款和储蓄在表示实现章程 getStringTask 的职责中。 await 运算符从 getStringTask 中追寻结果。赋值语句将追寻到的结果赋给 urlContents。

  ⑧ 当 AccessTheWebAsync 具备字符串结果时,该方式能够计算字符串长度。然后,AccessTheWebAsync 专门的职业也将产生,並且等待事件处理程序可继续选拔。 

 

  你能够尝试思量一动手拉手行为和异步行为之间的距离。当其职业完毕时(第 5 步)会回到三个共同方法,但当其行事挂起时(第 3 步和第 6 步),异步方法会重返一个职务值。在异步方法最后成就其行事时,职责会标识为已产生,而结果(假如有)将积攒在职务中。

 

四、异步方法的调整流(大旨)

  异步编制程序中最紧要却不易懂的是调节流,即分歧方法间的切换。以后,请用一颗感恩的心来观察下图。

澳门新浦京娱乐场网站 6

  步骤分析:

  ① 事件管理程序调用并等候 AccessTheWebAsync() 异步方法。

  ② AccessTheWebAsync 创立 HttpClient 对象并调用它的 GetStringAsync 异步方法来下载网址内容。

  ③ 倘使 GetStringAsync 中爆发了某种意况,这场馆挂起了它的历程。大概必须等待网址下载或局部其它阻塞的移动。为防止阻塞能源,GetStringAsync() 会将调整权出让给其调用方 AccessTheWebAsync。GetStringAsync 重返 Task,在这之中 TResult 为字符串,并且 AccessTheWebAsync 将职分分配给 getStringTask 变量。该职责表示调用 GetStringAsync 的正在打开的历程,在那之中承诺当工作到位时发生实际字符串值。

  ④ 由于尚未等待 getStringTask,由此,AccessTheWebAsync 能够继续试行不借助于 GetStringAsync 得出最后结果的别的职分。该任务由对共同方法 DoIndependentWork 的调用表示。

  ⑤ DoIndependentWork 是实现其行事并赶回其调用方的贰头方法。

  ⑥ AccessTheWebAsync 已成功职业,能够不受 getStringTask 的结果影响。 接下来,AccessTheWebAsync 须要计算并赶回该下载字符串的尺寸,但该办法仅在具有字符串时手艺臆度该值。因此,AccessTheWebAsync 使用二个 await 运算符来挂起其速度,并把调控权交给调用 AccessTheWebAsync 的办法。AccessTheWebAsync 将 Task<int> 重回至调用方。 该职责表示对发生下载字符串长度的整数结果的二个承诺。

  【备注】假设 GetStringAsync(即 getStringTask)在 AccessTheWebAsync 等待前成功,则调整权会保留在 AccessTheWebAsync 中。 假若异步调用过程(getStringTask) 已做到,並且 AccessTheWebSync 不必等待最后结果,则挂起接下来重临到 AccessTheWebAsync,但那会促成基金的萧条。

  在调用方内部(假设那是多少个事件管理程序),管理格局将持续。在等候结果前,调用方能够举办不依据于 AccessTheWebAsync 结果的别的干活,否则就需静观其变片刻。事件管理程序等待 AccessTheWebAsync,而 AccessTheWebAsync 等待 GetStringAsync。

  ⑦ GetStringAsync 完毕并生成一个字符串结果。 字符串结果不是经过你预期的点子调用 GetStringAsync 所重临的。(请牢记,此方法已在步骤 3 中回到一个任务。)相反,字符串结果存款和储蓄在代表实现章程 getStringTask 的天职业中学。 await 运算符从 getStringTask 中搜求结果。赋值语句将寻觅到的结果赋给 urlContents。

  ⑧ 当 AccessTheWebAsync 具备字符串结果时,该格局能够总计字符串长度。然后,AccessTheWebAsync 职业也将完结,并且等待事件管理程序可三番两次利用。 

 

  你可以尝试思索一下一同行为和异步行为之间的距离。当其行事实现时(第 5 步)会回到贰个联合方法,但当其工作挂起时(第 3 步和第 6 步),异步方法会重返八个职务值。在异步方法最后水到渠成其行事时,任务会标识为已产生,而结果(假使有)将积存在职分中。

 

三、更便于编写的异步方法

  C# 中的 async 和 await 关键字都以异步编制程序的为主。通过行使那四个首要字,你能够选拔.NET framework 或 Windows 运维时中的能源轻巧成立异步方法(差十分的少与创设同步方法一样轻松)。

  下边的亲自去做演示了一种采取async 和 await 定义的异步方法。

 1         /// <summary>
 2         /// 异步访问 Web 
 3         /// </summary>
 4         /// <returns></returns>
 5         /// <remarks>
 6         /// 方法签名的 3 要素:
 7         ///     ① async 修饰符
 8         ///     ② 返回类型 Task 或 Task<TResult>:这里的 Task<int> 表示 return 语句返回 int 类型
 9         ///     ③ 方法名以 Async 结尾
10         /// </remarks>
11         async Task<int> AccessTheWebAsync()
12         {
13             //记得 using System.Net.Http 哦
14             var client = new HttpClient();
15 
16             //执行异步方法 GetStringAsync
17             Task<string> getStringTask = client.GetStringAsync("http://www.google.com.hk/");
18 
19             //假设在这里执行一些非异步的操作
20             DoIndependentWork();
21 
22             //等待操作挂起方法 AccessTheWebAsync
23             //直到 getStringTask 完成,AccessTheWebAsync 方法才会继续执行
24             //同时,控制将返回到 AccessTheWebAsync 方法的调用方
25             //直到 getStringTask 完成后,将在这里恢复控制。
26             //然后从 getStringTask 拿到字符串结果
27             string urlContents = await getStringTask;
28 
29             //返回字符串的长度(int 类型)
30             return urlContents.Length;
31         }

 

  假若 AccessTheWebAsync 在调用 GetStringAsync 时未有别的操作,你能够用如此的办法来简化代码。

string urlContents = await client.GetStringAsync("http://www.google.com.hk/");

  

  依照上述代码进行简易总括:

澳门新浦京娱乐场网站的异步编制程序。  (1)方法具名富含三个 async 修饰符。

  (2)依据约定,异步方法的名目以“Async”后缀为最终。

  (3)再次回到类型为下列项目之一:

    ① 如若你的措施有操作数为 TResult 类型的归来语句,则为 Task<TResult>。

    ② 假如您的主意未有回来语句或享有未有操作数的归来语句,则为 Task。

    ③ 假设您编写的是异步事件管理程序,则为 void。

  (4)方法平日包括最少贰个await 表明式,该表达式标志多个点,在该点上,直到等待的异步操作完成章程手艺持续。 同不经常候,将艺术挂起,並且调整权将重临到点子的调用方。

  在异步方法中,可采用提供的首要字和档期的顺序来提醒供给达成的操作,且编写翻译器会产生其它操作。 

 

异步提升响应技巧

异步升高响应本领

五、异步中的线程

  异步方法目的在于成为非阻塞操作。异步方法中的 await 表明式在伺机的天职实践的还要不会卡住当前线程。相反,await 表达式在继续实行时办法的别的部分并将调节权再次回到到异步方法的调用方。

  async 和 await 关键字不会变成创造别的线程。因为异步方法不会在其自个儿线程上运维,因而它无需八线程。独有当方法处于活动状态时,该办法将要时下一起上下文中运营并动用线程上的岁月。能够使用 Task.Run 将攻陷大量CPU 的干活移到后台线程,不过后台线程不会援救正在等待结果的进度变为可用状态。

  对于异步编制程序来讲,该基于异步的章程优于差不离每一个用例中的现存措施。具体来讲,此方法比 BackgroundWorker 更适用于 IO 绑定的操作,因为此代码更简便且没有要求防守当先争用规范。结合 Task.Run() 使用时,异步编制程序比 BackgroundWorker 更适用于 CPU 绑定的操作,因为异步编制程序将运营代码的调理细节与 Task.Run 传输至线程池的劳作分别开来。

 

五、异步中的线程

  异步方法旨在成为非阻塞操作。异步方法中的 await 表明式在等候的任务实践的同期不会阻塞当前线程。相反,await 表明式在继续实践时办法的别的部分并将调节权重回到异步方法的调用方。

  async 和 await 关键字不会招致成立其余线程。因为异步方法不会在其自身线程上运营,由此它不需求多线程。唯有当方法处于活动状态时,该措施就要当下联合签名上下文中运行并运用线程上的时日。能够动用 Task.Run 将占领大量CPU 的办事移到后台线程,但是后台线程不会推抢正在等候结果的进程变为可用状态。

  对于异步编制程序来讲,该基于异步的方式优于大概种种用例中的现成措施。具体来说,此方式比 BackgroundWorker 更适用于 IO 绑定的操作,因为此代码更简约且无需防止当先争用标准化。结合 Task.Run() 使用时,异步编制程序比 BackgroundWorker 更适用于 CPU 绑定的操作,因为异步编制程序将运维代码的协调细节与 Task.Run 传输至线程池的劳作分别开来。

 

四、异步方法的调节流(主旨)

  异步编制程序中最需弄清的是调控流,即什么从一个办法移动到另一个主意, 请用一颗感恩的心来察看下图。

  步骤分析:

  ① 事件处理程序调用并听候 AccessTheWebAsync 异步方法。

  ② AccessTheWebAsync 创造 HttpClient 对象并调用它的 GetStringAsync 异步方法来下载网址内容。

  ③ 假若 GetStringAsync 中发出了某种意况,该地方挂起了它的长河。大概必得等待网站下载或局地另外阻塞的移位。为幸免阻塞资源,GetStringAsync 会将调整权出让给其调用方 AccessTheWebAsync。GetStringAsync 重回 Task,此中 TResult 为字符串,何况 AccessTheWebAsync 将职分分配给 getStringTask 变量。该职务表示调用 GetStringAsync 的正在进行的进程,其中承诺当专门的学业到位时发出实际字符串值。

  ④ 由于未有等待 getStringTask,因而,AccessTheWebAsync 能够继续施行不借助于 GetStringAsync 得出最后结出的另外职务。该职分由对同步方法 DoIndependentWork 的调用表示。

  ⑤ DoIndependentWork 是到位其工作并回到其调用方的同步方法。

  ⑥ AccessTheWebAsync 已成功工作,能够不受 getStringTask 的结果影响。 接下来,AccessTheWebAsync 要求总括并赶回该下载字符串的尺寸,但该措施仅在享有字符串时才干臆度该值。因而,AccessTheWebAsync 使用二个 await 运算符来挂起其速度,并把调节权交给调用 AccessTheWebAsync 的方式。AccessTheWebAsync 将 Task<int> 再次来到至调用方。 该职分表示对发生下载字符串长度的大背头结果的一个答应。

  【备注】假使 GetStringAsync(即 getStringTask)在 AccessTheWebAsync 等待前成功,则调整权会保留在 AccessTheWebAsync 中。 借使异步调用过程(getStringTask) 已成功,並且 AccessTheWebSync 不必等待最后结果,则挂起接下来回到到 AccessTheWebAsync,但这会导致资金财产的浪费。

  在调用方内部(假使那是一个事件管理程序),管理情势将持续。在等候结果前,调用方可以张开不依附于 AccessTheWebAsync 结果的别的职业,不然就需等候片刻。事件管理程序等待 AccessTheWebAsync,而 AccessTheWebAsync 等待 GetStringAsync。

  ⑦ GetStringAsync 实现并生成四个字符串结果。 字符串结果不是经过你预期的法子调用 GetStringAsync 所再次回到的。(请牢记,此方法已在步骤 3 中回到一个职责。)相反,字符串结果存款和储蓄在象征达成措施 getStringTask 的职务中。 await 运算符从 getStringTask 中追寻结果。赋值语句将寻觅到的结果赋给 urlContents。

  ⑧ 当 AccessTheWebAsync 具备字符串结果时,该方法能够计算字符串长度。然后,AccessTheWebAsync 专门的学问也将不负众望,何况等待事件管理程序可继续行使。 

 

  你能够品尝思考一下合伙行为和异步行为之间的异样。当其专门的学问做到时(第 5 步)会回来七个联名方法,但当其专门的工作挂起时(第 3 步和第 6 步),异步方法会重回三个职分值。在异步方法最终马到成功其职业时,职务会标志为已做到,而结果(假若有)将储存在任务中。

 

 

 

六、async 和 await 修饰符

  当您采纳 async 修饰符钦点该措施为异步方法时:

  • 能够选拔 await 来钦定悬挂点。await 运算符会告诉编写翻译器,异步方法独有直到等待的异步进度进行到位,技能持续透过该点往下施行。同一时间,调控权将回来至异步方法的调用方。await 表明式中异步方法在挂起后,假诺该方法还未有推行到位并退出,finally 块中的将不会实行。

  • 澳门新浦京娱乐场网站的异步编制程序。标识的异步方法自身能够透过调用它的不二等秘书诀开展等待。异步方法中国和东瀛常包罗一个或四个await 运算符,当然,八个 await 表明式都不设有也不会导致编写翻译器错误,不过编写翻译器会产生警示,该措施在施行的时候依旧会遵纪守法同步方法来实行,async 其实只是一个标志的效果而已,告诉编写翻译器他“应该”是三个异步方法。

 

六、async 和 await 修饰符

  当你选拔 async 修饰符钦命该格局为异步方法时:

  • 可以运用 await 来钦赐悬挂点。await 运算符会告诉编写翻译器,异步方法独有直到等待的异步进程实行到位,能力承接透过该点往下实施。同有的时候间,调节权将回到至异步方法的调用方。await 说明式中异步方法在挂起后,要是该措施还尚无推行到位并退出,finally 块中的将不会实行。

  • 标识的异步方法本人能够通过调用它的艺术开展等待。异步方法中平日饱含三个或四个await 运算符,当然,三个 await 表达式都不设有也不会变成编写翻译器错误,可是编写翻译器会产生警告,该格局在试行的时候仍旧会遵从同步方法来实践,async 其实只是多少个标志的功能而已,告诉编写翻译器他“应该”是三个异步方法。

 

五、线程

  异步方法目的在于成为非阻塞操作。异步方法中的 await 表明式在等候的职责正在周转时不会堵塞当前线程。相反,表明式在持续时登记格局的别的部分并将调控权重临到异步方法的调用方。

  async 和 await 关键字不会促成创制其余线程。因为异步方法不会在其本身线程上运转,因而它无需多线程。只有当方法处于活动状态时,该措施将要方今三只上下文中运营并利用线程上的光阴。能够运用 Task.Run 将攻陷大批量CPU 的职业移到后台线程,不过后台线程不会帮助正在等候结果的经过变为可用状态。

  对于异步编制程序来讲,该基于异步的情势优于差不离各种用例中的现存措施。具体来说,此情势比 BackgroundWorker 更适用于 IO 绑定的操作,因为此代码更简约且不供给防范当先争用口径。结合 Task.Run 使用时,异步编制程序比 BackgroundWorker 更适用于 CPU 绑定的操作,因为异步编制程序将运转代码的和煦细节与 Task.Run 传输至线程池的干活分别开来。

 

 

 

七、重返类型和参数消息

  在编制异步方法时,大家多方会动用 Task 和 Task<TResult> 作为重返类型。

 

  示例:

 1         static async Task<Guid> Method1Async()  //Task<Guid>
 2         {
 3             var result = Guid.NewGuid();
 4 
 5             await Task.Delay(1);
 6 
 7             //这里返回一个 Guid 的类型
 8             return result;
 9         }
10 
11         static async Task Method2Async()  //Task
12         {
13             //Do...
14 
15             await Task.Delay(1);
16 
17             //Do...
18 
19             //这里没有 return 语句
20         }

 1             //调用 Method1Async
 2             //方式一
 3             Task<Guid> t1 = Method1Async();
 4             Guid guid1 = t1.Result;
 5 
 6             //方式二
 7             Guid guid2 = await Method1Async();
 8 
 9             //调用 Method2Async
10             //方式一
11             Task t2 = Method2Async();
12             await t2;
13 
14             //方式二
15             await Method2Async();

  每一种重回的天职表示正在开展的办事。职责可包裹有关异步进度情形的音讯,假设未得逞,则最终会卷入来自进度的结尾结果,或许是由该过程引发的不胜。

 

  【疑问】那么 void 再次来到类型是在什么样景况下才使用的吗?

  首要用以异步的事件管理程序,异步事件管理程序通常作为异步程序的开头点。void 再次回到类型告诉了编写翻译器,不要求对她开展等待,况兼,对于 void 重回类型的秘籍,大家也无可奈何对她开展非常的捕捉。

 

  异步方法不可见在参数中申明与使用 ref 和 out 关键字,可是异步方法能够调用包含这个参数的格局。

 

七、再次来到类型和参数音讯

  在编写制定异步方法时,大家多方会采取Task 和 Task<TResult> 作为重返类型。

 

  示例:

 1         static async Task<Guid> Method1Async()  //Task<Guid>
 2         {
 3             var result = Guid.NewGuid();
 4 
 5             await Task.Delay(1);
 6 
 7             //这里返回一个 Guid 的类型
 8             return result;
 9         }
10 
11         static async Task Method2Async()  //Task
12         {
13             //Do...
14 
15             await Task.Delay(1);
16 
17             //Do...
18 
19             //这里没有 return 语句
20         }

 1             //调用 Method1Async
 2             //方式一
 3             Task<Guid> t1 = Method1Async();
 4             Guid guid1 = t1.Result;
 5 
 6             //方式二
 7             Guid guid2 = await Method1Async();
 8 
 9             //调用 Method2Async
10             //方式一
11             Task t2 = Method2Async();
12             await t2;
13 
14             //方式二
15             await Method2Async();

  每一种再次回到的天职表示正在开展的做事。职务可包裹有关异步进度情形的音信,假使未成功,则最后会卷入来自进程的末段结出,可能是由该进程引发的万分。

 

  【疑问】那么 void 再次来到类型是在怎么着情况下才使用的吗?

  首要用于异步的事件管理程序,异步事件管理程序经常作为异步程序的发轫点。void 重返类型告诉了编写翻译器,无需对她张开等待,并且,对于 void 重回类型的主意,大家也不也许对她张开丰裕的捕捉。

 

  异步方法无法在参数中声称与应用 ref 和 out 关键字,不过异步方法能够调用满含这些参数的格局。

 

六、async 和 await

  借使因此应用 async 修饰符内定某种格局为异步方法,则会现出上面二种现象。

  • 标识的异步方法可以动用 await 来钦点悬挂点。await 运算符文告编写翻译器异步方法独有直到等待的异步进程实现才干三回九转通过该点。同有时候,调整权将再次回到至异步方法的调用方。

    await 表明式中异步方法的挂起无法使该办法退出,并且 finally 块不会运转。

  • 标识的异步方法自个儿能够因此调用它的艺术等待。

  异步方法日常包涵await 运算符的四个或多少个匹配项,但贫乏 await 表明式不会促成编写翻译器错误。借使异步方法未选取await 运算符标识悬挂点,则该办法将用香港作家联谊晤面方法实施,不管异步修饰符如何。编写翻译器将为此类措施公布一个警戒。

 

异步对恐怕引起短路的运动(举个例子应用程序访谈Web 时)至关心注重要。 对 Web 财富的访问不经常非常慢或会推迟。 要是此类活动在一块儿进度中受阻,则全体应用程序必得等待。 在异步进度中,应用程序可继续执行不依赖Web 能源的任何干活,直至潜在阻止职务完毕。

异步对可能孳生短路的位移(比方应用程序访谈Web 时)至关心重视要。 对 Web 财富的访谈偶然异常的慢或会延迟。 假诺此类活动在一道进度中受阻,则全体应用程序必需等待。 在异步进度中,应用程序可继续推行不依赖Web 财富的其他干活,直至潜在阻止任务成功。

八、命名的约定

  依据约定,使用 async 的方法都应有以“Async”作为后缀,如:DownloadAsync() 。然而,假如某一约定中的事件、基类或接口有另外的情势约定,则能够忽略上述约定。譬如,不应该修改或重命名常用事件管理程序,如 btnOpen_Click。

 

八、命名的约定

  依据预定,使用 async 的秘籍都应有以“Async”作为后缀,如:DownloadAsync() 。可是,假如某一约定中的事件、基类或接口有任何的花样约定,则足以忽略上述约定。比如,不该修改或重命名常用事件管理程序,如 btnOpen_Click。

 

七、再次回到类型和参数消息

  在 .NET 中,异步方法日常重返 Task 或 Task<TResult>。在异步方法中,await 运算符应用于通过调用另一个异步方法重返的职分。

  若是方式包括 钦点项目 TResult 的操作数的 return 语句,则将 Task<TResult> 钦命为回到类型。

  若是艺术不含任何 return 语句或含有不回来操作数的 return 语句,则将 Task 用作重返类型。

  上面的亲自去做演示如何阐明并调用可重回 Task 或 Task<TResult> 的艺术。

 1         static async Task<Guid> Method1Async()  //Task<Guid>
 2         {
 3             var result = Guid.NewGuid();
 4 
 5             await Task.Delay(1);
 6 
 7             //这里返回一个 Guid 的类型
 8             return result;
 9         }
10 
11         static async Task Method2Async()  //Task
12         {
13             //Do...
14 
15             await Task.Delay(1);
16 
17             //Do...
18 
19             //这里没有 return 语句
20         }

 1             //调用 Method1Async
 2             //方式一
 3             Task<Guid> t1 = Method1Async();
 4             Guid guid1 = t1.Result;
 5 
 6             //方式二
 7             Guid guid2 = await Method1Async();
 8 
 9             //调用 Method2Async
10             //方式一
11             Task t2 = Method2Async();
12             await t2;
13 
14             //方式二
15             await Method2Async();

  每个重临的天职表示正在开展的专门的工作。职分可包裹有关异步进度景况的音信,假设未中标,则最后会卷入来自进程的末梢结出或进程引发的十分。

  异步方法还足以是持有 void 重临类型。该重返类型首要用于定义须要 void 重临类型的事件管理程序。异步事件管理程序平时作为异步程序的开头点。

  不可能等待拥有 void 重返类型的异步方法,而且一个void 重返值的调用方无法捕获该办法引发的其他极其。

  异步方法不能够注脚C# 中的 ref 或 out 参数,但此格局能够调用具备此类参数的办法。

 

下表显示了异步编制程序进步响应技艺的无出其右应用场景。 从 .NET Framework 4.5 和 Windows 运转时中列出的 API 包涵支持异步编制程序的主意。

下表呈现了异步编制程序提升响应手艺的卓越应用场景。 从 .NET Framework 4.5 和 Windows 运维时中列出的 API 满含帮忙异步编制程序的章程。

传送门 

  1. 走进异步编制程序的社会风气 - 开首接触 async/await(推荐)

  2. 走进异步编制程序的社会风气 - 解析异步方法(上)

  3. 走进异步编制程序的世界 - 解析异步方法(下)

  4. 走进异步编制程序的社会风气 - 在 GUI 中进行异步操作

 


【参谋援用】微软官方文档图片

【参考】

 

传送门 

  1. 走进异步编制程序的社会风气 - 初叶接触 async/await(推荐)

  2. 走进异步编制程序的社会风气 - 剖判异步方法(上)

  3. 走进异步编制程序的世界 - 剖判异步方法(下)

  4. 走进异步编制程序的世界 - 在 GUI 中进行异步操作

 


【参照他事他说加以考察引用】微软官方文档图片

【参考】

 

八、命名的约定

  依据预订,将“Async”追加到具备 async 修饰符的点子名称。

  借使某一约定中的事件、基类或接口协定建议其余名目,则足以忽略此预订。比方,你不应重命名常用事件管理程序,举例 btnOpen_Click。

 

应用程序区域

包含异步方法的受支持的 API

Web 访问

HttpClient SyndicationClient

使用文件

StorageFileStreamWriterStreamReaderXmlReader

使用图像

MediaCaptureBitmapEncoderBitmapDecoder

WCF 编程

同步和异步操作

   

应用程序区域

包含异步方法的受支持的 API

Web 访问

HttpClient SyndicationClient

使用文件

StorageFileStreamWriterStreamReaderXmlReader

使用图像

MediaCaptureBitmapEncoderBitmapDecoder

WCF 编程

同步和异步操作

   

传送门 

 


【参谋引用】微软官方文书档案图片

 

 

] 利用 async await 的异步编制程序,.net利用async 利用 async await 的异步编制程序 【博主】反骨仔 【出处】 目录...

出于具有与顾客分界面相关的移动日常分享二个线程,由此,异步对拜见UI 线程的应用程序来说更为关键。 倘若其他进度在共同应用程序中受阻,则有着进程都将受阻。 你的应用程序甘休响应,由此,你大概在其等待历程中以为它曾经停业。

鉴于负有与客商分界面相关的运动日常共享八个线程,由此,异步对拜见UI 线程的应用程序来讲特别主要。 如若其余进度在共同应用程序中受阻,则装有进程都将受阻。 你的应用程序结束响应,因而,你可能在其等待历程中感到它早就停业。

使用异步方法时,应用程序将继续响应 UI。 举个例子,你能够调动窗口的大大小小或最小化窗口;假使您不期望等待应用程序甘休,则可以将其关闭。

行使异步方法时,应用程序将持续响应 UI。 例如,你能够调动窗口的深浅或最小化窗口;借使您不期待等待应用程序结束,则能够将其关闭。

当设计异步操作时,该基于异步的办法将机关传输的同样对象加多到可从当中选取的选项列表中。 开垦职员只要求投入很少的专门的学问量就能够使您收获古板异步编制程序的具备优点。

当设计异步操作时,该基于异步的主意将机关传输的均等对象加多到可从当中挑选的选项列表中。 开垦人士只须求投入相当少的工作量就能够使您获取守旧异步编制程序的装有优点。

异步方法更易于编写

异步方法更易于编写

 

 

 

 

Visual Basic 中的 Async 和 Await 关键字,以及 C# 中的 async 和 await 关键字都以异步编制程序的宗旨。 通过接纳那七个第一字,你能够利用 .NET framework 或 Windows 运转时中的财富轻易创立异步方法(差不离与创制同步方法同样自在)。 通过动用被称为异步方法的 async 和 await 定义的异步方法。

Visual Basic 中的 Async 和 Await 关键字,以及 C# 中的 async 和 await 关键字都以异步编制程序的基本。 通过使用那三个第一字,你能够应用 .NET framework 或 Windows 运维时中的财富轻便创造异步方法(差相当的少与创制同步方法一致自在)。 通过动用被誉为异步方法的 async 和 await 定义的异步方法。

下边包车型客车演示演示了一种异步方法。 你应对代码中的大致具备内容都特别精通。 注释调出你加多的用来创立异步的意义。

上边包车型大巴演示演示了一种异步方法。 你应对代码中的差不离具备内容都不行熟识。 注释调出你增添的用来创设异步的效果。

你能够在本主题的末段找到完整的示范文件,何况能够从 Async 示例:“使用 Async 和 Await 实行异步编制程序”的亲自去做下载此示例。

你能够在本宗旨的终极找到完整的示范文件,並且能够从 Async 示例:“使用 Async 和 Await 进行异步编制程序”的身体力行下载此示例。

 1 // Three things to note in the signature:
 2 //  - The method has an async modifier. 
 3 //  - The return type is Task or Task<T>. (See "Return Types" section.)
 4 //    Here, it is Task<int> because the return statement returns an integer.
 5 //  - The method name ends in "Async."
 6 async Task<int> AccessTheWebAsync()
 7 { 
 8     // You need to add a reference to System.Net.Http to declare client.
 9     HttpClient client = new HttpClient();
10 
11     // GetStringAsync returns a Task<string>. That means that when you await the
12     // task you'll get a string (urlContents).
13     Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
14 
15     // You can do work here that doesn't rely on the string from GetStringAsync.
16     DoIndependentWork();
17 
18     // The await operator suspends AccessTheWebAsync.
19     //  - AccessTheWebAsync can't continue until getStringTask is complete.
20     //  - Meanwhile, control returns to the caller of AccessTheWebAsync.
21     //  - Control resumes here when getStringTask is complete. 
22     //  - The await operator then retrieves the string result from getStringTask.
23     string urlContents = await getStringTask;
24 
25     // The return statement specifies an integer result.
26     // Any methods that are awaiting AccessTheWebAsync retrieve the length value.
27     return urlContents.Length;
28 }
 1 // Three things to note in the signature:
 2 //  - The method has an async modifier. 
 3 //  - The return type is Task or Task<T>. (See "Return Types" section.)
 4 //    Here, it is Task<int> because the return statement returns an integer.
 5 //  - The method name ends in "Async."
 6 async Task<int> AccessTheWebAsync()
 7 { 
 8     // You need to add a reference to System.Net.Http to declare client.
 9     HttpClient client = new HttpClient();
10 
11     // GetStringAsync returns a Task<string>. That means that when you await the
12     // task you'll get a string (urlContents).
13     Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
14 
15     // You can do work here that doesn't rely on the string from GetStringAsync.
16     DoIndependentWork();
17 
18     // The await operator suspends AccessTheWebAsync.
19     //  - AccessTheWebAsync can't continue until getStringTask is complete.
20     //  - Meanwhile, control returns to the caller of AccessTheWebAsync.
21     //  - Control resumes here when getStringTask is complete. 
22     //  - The await operator then retrieves the string result from getStringTask.
23     string urlContents = await getStringTask;
24 
25     // The return statement specifies an integer result.
26     // Any methods that are awaiting AccessTheWebAsync retrieve the length value.
27     return urlContents.Length;
28 }

就算 AccessTheWebAsync 在调用 GetStringAsync 和等候其产生时期无法展开其余职业,则你能够通过在底下的单个语句中调用和等候来简化代码。

万一 AccessTheWebAsync 在调用 GetStringAsync 和等待其实现时期不可能扩充其余专门的学业,则你能够经过在底下的单个语句中调用和等候来简化代码。

1 string urlContents = await client.GetStringAsync();
1 string urlContents = await client.GetStringAsync();

以下特征总计了使上三个演示成为异步方法的原由。

以下特征总括了使上三个示范成为异步方法的开始和结果。

  • 办法签字包括贰个 Async 或 async 修饰符。

  • 遵守预约,异步方法的名称以“Async”后缀为尾声。

  • 回去类型为下列项目之一:

    • 倘诺您的艺术有操作数为 TResult 类型的回来语句,则为 Task<TResult>。

    • 若是您的形式未有回来语句或具备未有操作数的回到语句,则为 Task。

    • 如若你编写的是异步事件处理程序,则为 Void(Visual Basic 中为 Sub)。

    有关详细新闻,请参见本主旨后边的“重回类型和参数”。

  • 主意日常满含起码一个await 表明式,该表达式标志一个点,在该点上,直到等待的异步操作实现议程工夫持续。 同一时候,将艺术挂起,而且控件重临到格局的调用方。 本核心的下一节将表达悬挂点爆发的景况。

  • 方式签字包涵四个 Async 或 async 修饰符。

  • 坚守约定,异步方法的称呼以“Async”后缀为末段。

  • 回到类型为下列项目之一:

    • 若是你的主意有操作数为 TResult 类型的归来语句,则为 Task<TResult>。

    • 比如你的方法未有回去语句或持有未有操作数的回到语句,则为 Task。

    • 假诺你编写的是异步事件管理程序,则为 Void(Visual Basic 中为 Sub)。

    有关详细音信,请参见本主旨后边的“重返类型和参数”。

  • 主意日常包括起码贰个await 表明式,该表达式标识贰个点,在该点上,直到等待的异步操作完毕章程技巧持续。 同期,将艺术挂起,並且控件重临到格局的调用方。 本核心的下一节将表达悬挂点发生的状态。

在异步方法中,可使用提供的要害字和品种来提示需求产生的操作,且编写翻译器会产生其余操作,在那之中囊括不断追踪控件以挂起方法重回等待点时发出的动静。 一些常规流程(比如,循环和非常管理)在古板异步代码中拍卖起来也许特别不便。 在异步方法中,成分的编辑频率与联合实施方案相同且此难题获得缓和。

在异步方法中,可使用提供的要害字和等级次序来提示必要做到的操作,且编写翻译器会落成别的操作,当中包蕴不断追踪控件以挂起方法再次回到等待点时爆发的景色。 一些正常流程(举个例子,循环和这几个管理)在思想异步代码中拍卖起来恐怕很难堪。 在异步方法中,成分的编写制定频率与协助进行解决方案同样且此难题获得化解。

至于 .NET Framework 早先时期版本中的异步的更加多音讯,请参见 TPL and Traditional .NET Framework Asynchronous Programming。

至于 .NET Framework 初期版本中的异步的更加的多音讯,请参见 TPL and Traditional .NET Framework Asynchronous Programming。

异步方法中生出的政工

异步方法中生出的事务

 

 

 

 

异步编制程序中最需弄清的是调节流是哪些从章程移动到格局的。 下图可指点你完了该进度。

异步编制程序中最需弄清的是调控流是什么样从事艺术工作术移动到点子的。 下图可辅导你成功该进度。

澳门新浦京娱乐场网站 7

澳门新浦京娱乐场网站 8

论及图中的数值对应于以下步骤。

涉嫌图中的数值对应于以下步骤。

  1. 事件管理程序调用并等候 AccessTheWebAsync 异步方法。

  2. AccessTheWebAsync 可创建 HttpClient 实例并调用 GetStringAsync 异步方法以下载网址内容作为字符串。

  3. GetStringAsync 中生出了某种情状,该情形挂起了它的历程。 恐怕必需等待网址下载或一些别的阻止活动。 为幸免阻止能源,GetStringAsync 会将调控权出让给其调用方 AccessTheWebAsync。

    GetStringAsync 返回 Task<TResult>,个中TResult 为字符串,何况 AccessTheWebAsync 将职务分配给 getStringTask 变量。 该职务表示调用 GetStringAsync 的正在开展的经过,在那之中承诺当职业成就时发出实际字符串值。

  4. 鉴于尚未等待 getStringTask,由此,AccessTheWebAsync 能够继续试行不正视于 GetStringAsync 得出的末梢结出的别的干活。 该职责由对伙同方法 DoIndependentWork 的调用表示。

  5. DoIndependentWork 是马到成功其行事并重返其调用方的一道方法。

  6. AccessTheWebAsync 已用完职业,能够不受 getStringTask 的结果影响。 接下来,AccessTheWebAsync 供给总括并赶回该下载字符串的长度,但该方法仅在具备字符串时技巧总计该值。

    于是,AccessTheWebAsync 使用贰个 await 运算符来挂起其速度,并把调节权交给调用 AccessTheWebAsync 的办法。AccessTheWebAsync 将 Task(Of Integer) 或 Task<int> 再次来到至调用方。 该任务表示对发出下载字符串长度的整数结果的一个答应。

    注意

    如果 GetStringAsync(因此 getStringTask)在 AccessTheWebAsync 等待前完成,则控件会保留在 AccessTheWebAsync 中。 如果异步调用过程 (AccessTheWebAsync) 已完成,并且 AccessTheWebSync 不必等待最终结果,则挂起然后返回到 getStringTask 将造成成本浪费。

    在调用方内部(此示例中的事件管理程序),管理情势将持续。 在等候结果前,调用方能够实行不相信任于 AccessTheWebAsync 结果的其余专门的学问,不然就需等待片刻。 事件管理程序等待 AccessTheWebAsync,而 AccessTheWebAsync 等待 GetStringAsync

  7. GetStringAsync 完毕并生成叁个字符串结果。 字符串结果不是因而按你预期的点子调用 GetStringAsync 所重返的。 (记住,该方法已回到步骤 3 中的二个职务)。 相反,字符串结果存款和储蓄在代表完毕 getStringTask 方法的天职业中学。 await 运算符从 getStringTask 中追寻结果。赋值语句将寻觅到的结果赋给 urlContents。

  8. 当 AccessTheWebAsync 具备字符串结果时,该办法能够总结字符串长度。 然后,AccessTheWebAsync 工作也将变成,并且等待事件管理程序可继续行使。 在此主旨结尾处的一体化示例中,可确认事件管理程序检索并打字与印刷长度结果的值。

  1. 事件管理程序调用并等候 AccessTheWebAsync 异步方法。

  2. AccessTheWebAsync 可创建 HttpClient 实例并调用 GetStringAsync 异步方法以下载网址内容作为字符串。

  3. GetStringAsync 中发生了某种景况,该情形挂起了它的进程。 恐怕必需等待网址下载或部分别的阻止活动。 为防止阻止财富,GetStringAsync 会将调控权出让给其调用方 AccessTheWebAsync。

    GetStringAsync 返回 Task<TResult>,在那之中TResult 为字符串,况兼 AccessTheWebAsync 将职责分配给 getStringTask 变量。 该职责表示调用 GetStringAsync 的正在打开的历程,在那之中承诺当工作成就时爆发实际字符串值。

  4. 鉴于并没有等待 getStringTask,由此,AccessTheWebAsync 能够继续施行不借助于于 GetStringAsync 得出的末梢结出的别的工作。 该职分由对同步方法 DoIndependentWork 的调用表示。

  5. DoIndependentWork 是成功其行事并回到其调用方的一道方法。

  6. AccessTheWebAsync 已用完专门的学问,能够不受 getStringTask 的结果影响。 接下来,AccessTheWebAsync 要求总括并赶回该下载字符串的长短,但该办法仅在有着字符串时技巧猜想该值。

    从而,AccessTheWebAsync 使用二个 await 运算符来挂起其速度,并把调整权交给调用 AccessTheWebAsync 的艺术。AccessTheWebAsync 将 Task(Of Integer) 或 Task<int> 重临至调用方。 该职务表示对发生下载字符串长度的大背头结果的三个答应。

    注意

    如果 GetStringAsync(因此 getStringTask)在 AccessTheWebAsync 等待前完成,则控件会保留在 AccessTheWebAsync 中。 如果异步调用过程 (AccessTheWebAsync) 已完成,并且 AccessTheWebSync 不必等待最终结果,则挂起然后返回到 getStringTask 将造成成本浪费。

    在调用方内部(此示例中的事件管理程序),管理形式将继续。 在守候结果前,调用方能够拓宽不借助于于 AccessTheWebAsync 结果的其余干活,不然就需等候片刻。 事件管理程序等待 AccessTheWebAsync,而 AccessTheWebAsync 等待 GetStringAsync

  7. GetStringAsync 完结并生成贰个字符串结果。 字符串结果不是透过按您预期的章程调用 GetStringAsync 所重回的。 (记住,该方法已回到步骤 3 中的贰个职务)。 相反,字符串结果存款和储蓄在代表实现 getStringTask 方法的职务中。 await 运算符从 getStringTask 中寻觅结果。赋值语句将追寻到的结果赋给 urlContents。

  8. 当 AccessTheWebAsync 具有字符串结果时,该办法可以估测计算字符串长度。 然后,AccessTheWebAsync 职业也将做到,并且等待事件处理程序可两次三番采纳。 在此主旨结尾处的完全示例中,可确认事件管理程序检索并打字与印刷长度结果的值。

若是你不纯熟异步编制程序,请花 1 分钟时间考虑共同行为和异步行为之间的异样。 当其行事做到时(第 5 步)会再次回到三个一头方法,但当其行事挂起时(第 3 步和第 6 步),异步方法会重返多个职分值。 在异步方法最后水到渠成其工作时,职分会标志为已做到,而结果(若是有)将积攒在义务中。

一旦您不熟练异步编制程序,请花 1 秒钟时间考虑共同行为和异步行为之间的异样。 当其行事成功时(第 5 步)会回去一个一块方法,但当其事业挂起时(第 3 步和第 6 步),异步方法会再次回到一个职分值。 在异步方法末了形成其专门的学问时,任务会标志为已到位,而结果(假如有)将积存在任务中。

至于调控流的更加多消息,请参见 异步程序中的调控流(C# 和 Visual Basic)。

有关调整流的越来越多音信,请参见 异步程序中的调控流(C# 和 Visual Basic)。

API 异步方法

API 异步方法

 

 

 

 

你可能想驾驭从何方可以找到 GetStringAsync 等协理异步编制程序的点子。.NET Framework 4.5 富含使用 async 和 await 的成都百货上千分子。 能够由此附加到成员名称的“Async”后缀和 Task 或 Task<TResult> 的归来类型识别那些分子。 比方,System.IO.Stream 类富含的点子CopyToAsync、ReadAsync、WriteAsync 等办法以及联合方法 CopyTo、Read 和 Write。

你恐怕想清楚从何方能够找到 GetStringAsync 等扶助异步编制程序的秘籍。.NET Framework 4.5 包罗使用 async 和 await 的浩大分子。 能够因此附加到成员名称的“Async”后缀和 Task 或 Task<TResult> 的归来类型识别那个分子。 比如,System.IO.Stream 类包蕴的秘技CopyToAsync、ReadAsync、WriteAsync 等办法以及协同方法 CopyTo、Read 和 Write。

Windows 运转时还满含众多在 Windows 8.x 应用公司应用中可与 async 和 await 一同使用的措施。 有关越多新闻和示范方法,请参见赶快入门:将 await 运算符用于异步编制程序、异步编制程序(Windows 应用公司应用)和WhenAny:.NET Framework 和 Windows 运行时之间的桥接(C# 和 Visual Basic)。

Windows 运营时还隐含众多在 Windows 8.x 应用集团应用中可与 async 和 await 一齐利用的方法。 有关越多消息和示范方法,请参见立时入门:将 await 运算符用于异步编制程序、异步编制程序(Windows 应用市肆应用)和WhenAny:.NET Framework 和 Windows 运转时之间的桥接(C# 和 Visual Basic)。

线程

线程

 

 

 

 

异步方法目的在于成为非阻止操作。 异步方法中的 await 表明式在守候的天职正在运营时不会阻碍当前线程。 相反,表明式在延续时登记格局的其余部分并将控件重回到异步方法的调用方。

异步方法目的在于成为非阻止操作。 异步方法中的 await 表明式在等候的天职正在运作时不会堵住当前线程。 相反,表明式在接二连三时登记格局的其他部分并将控件重回到异步方法的调用方。

async 和 await 关键字不会形成创制其余线程。 因为异步方法不会在其自己线程上运营,由此它不供给多线程。 唯有当方法处于活动状态时,该方法就要眼下一并上下文中运作并利用线程上的时刻。 能够采取 Task.Run 将攻克多量CPU 的办事移到后台线程,不过后台线程不会拉拉扯扯正在守候结果的进程变为可用状态。

async 和 await 关键字不会促成创造别的线程。 因为异步方法不会在其自个儿线程上运营,因而它无需三十二线程。 唯有当方法处于活动状态时,该格局将要脚下同步上下文中运作并行使线程上的小运。 能够选拔 Task.Run 将占用多量CPU 的职业移到后台线程,不过后台线程不会赞助正在等候结果的经过变为可用状态。

对此异步编制程序来说,该基于异步的点子优于大约每一个用例中的现存措施。 具体来说,此形式比 BackgroundWorker 更适用于 IO 绑定的操作,因为此代码更简短且无需防止争用口径。 结合 Task.Run 使用时,异步编制程序比 BackgroundWorker 更适用于 CPU 绑定的操作,因为异步编制程序将运转代码的和煦细节与 Task.Run 传输至线程池的做事分别开来。

对此异步编制程序来讲,该基于异步的点子优于大致各个用例中的现成措施。 具体来说,此情势比 BackgroundWorker 更适用于 IO 绑定的操作,因为此代码更简明且没有要求防止争用口径。 结合 Task.Run 使用时,异步编制程序比 BackgroundWorker 更适用于 CPU 绑定的操作,因为异步编制程序将运营代码的和煦细节与 Task.Run 传输至线程池的劳作分别开来。

异步和等待

异步和等待

 

 

 

 

一旦由此动用 Async 或 async 修饰符内定某种方式为异步方法,则足以启用以下三个职能。

假定因而利用 Async 或 async 修饰符钦定某种方式为异步方法,则能够启用以下三个作用。

  • 标志的异步方法能够动用 Await 或 await 来钦命悬挂点。 await 运算符布告编写翻译器异步方法唯有直到等待的异步进度做到技术三番五次通过该点。相同的时间,控件再次回到至异步方法的调用方。

    await 表明式中异步方法的挂起不能使该方法退出,而且 finally 块不会运作。

  • 标识的异步方法自己可以透过调用它的格局等待。

  • 标志的异步方法能够使用 Await 或 await 来钦赐悬挂点。 await 运算符文告编写翻译器异步方法独有直到等待的异步进度做到手艺一而再透过该点。相同的时间,控件重回至异步方法的调用方。

    await 表达式中异步方法的挂起不能够使该格局退出,何况 finally 块不会运作。

  • 标志的异步方法本人能够透过调用它的不二等秘书技等待。

异步方法日常包罗await 运算符的贰个或八个相配项,但贫乏 await 表明式不会产生编写翻译器错误。 假若异步方法未利用 await 运算符标志悬挂点,则该措施将作为联合举行方法施行,不管异步修饰符怎么样。 编写翻译器将为此类措施发表三个警告。

异步方法日常包蕴await 运算符的二个或两个匹配项,但贫乏 await 表明式不会招致编写翻译器错误。 假诺异步方法未选用await 运算符标识悬挂点,则该措施将用香港作家联谊会晤进行方法推行,不管异步修饰符如何。 编写翻译器将为此类措施发布八个告诫。

AsyncasyncAwait 和 await 都以上下文关键字。 有关愈来愈多消息和示范,请参见以下主旨:

AsyncasyncAwait 和 await 都是内外文关键字。 有关越多新闻和示范,请参见以下主旨:

  •  Async (Visual Basic)

  • async(C# 参考)

  • Await 运算符 (Visual Basic)

  • await(C# 参考)

  •  Async (Visual Basic)

  • async(C# 参考)

  • Await 运算符 (Visual Basic)

  • await(C# 参考)

回去类型和参数

回来类型和参数

 

 

 

 

在 .NET Framework 编制程序中,异步方法常常再次来到 Task 或 Task<TResult>。 在异步方法中,await 运算符应用于通过调用另五个异步方法重临的天职。

在 .NET Framework 编制程序中,异步方法经常再次来到 Task 或 Task<TResult>。 在异步方法中,await 运算符应用于通过调用另叁个异步方法重临的天职。

假使方式包蕴钦赐 TResult 类型的操作数的 Return (Visual Basic) 或 return (C#) 语句,则将 Task<TResult> 钦命为回到类型。

只要艺术包蕴钦命 TResult 类型的操作数的 Return (Visual Basic) 或 return (C#) 语句,则将 Task<TResult> 钦点为回去类型。

举例艺术不含任何 return 语句或含有不回去操作数的 return 语句,则将 Task 用作再次回到类型。

假若措施不含任何 return 语句或带有不回来操作数的 return 语句,则将 Task 用作重临类型。

下边包车型大巴身体力行演示如何注解并调用可重回 Task<TResult> 或 Task 的方法。

上边包车型地铁演示演示怎样注脚并调用可重回 Task<TResult> 或 Task 的方法。

1 // Signature specifies Task<TResult> async Task<int> TaskOfTResult_MethodAsync() { int hours; // . . . // Return statement specifies an integer result. return hours; } // Calls to TaskOfTResult_MethodAsync Task<int> returnedTaskTResult = TaskOfTResult_MethodAsync(); int intResult = await returnedTaskTResult; // or, in a single statement int intResult = await TaskOfTResult_MethodAsync(); // Signature specifies Task async Task Task_MethodAsync() { // . . . // The method has no return statement. } // Calls to Task_MethodAsync Task returnedTask = Task_MethodAsync(); await returnedTask; // or, in a single statement await Task_MethodAsync();
1 // Signature specifies Task<TResult> async Task<int> TaskOfTResult_MethodAsync() { int hours; // . . . // Return statement specifies an integer result. return hours; } // Calls to TaskOfTResult_MethodAsync Task<int> returnedTaskTResult = TaskOfTResult_MethodAsync(); int intResult = await returnedTaskTResult; // or, in a single statement int intResult = await TaskOfTResult_MethodAsync(); // Signature specifies Task async Task Task_MethodAsync() { // . . . // The method has no return statement. } // Calls to Task_MethodAsync Task returnedTask = Task_MethodAsync(); await returnedTask; // or, in a single statement await Task_MethodAsync();

各样再次来到的职责表示正在开展的劳作。 职务可包裹有关异步进程情形的消息,若是未成功,则最终会卷入来自进度的末尾结果或进度引发的拾贰分。

各样再次来到的职责表示正在开展的职业。 职分可包裹有关异步进度情状的新闻,假设未成功,则最终会卷入来自进度的终极结出或进度引发的格外。

异步方法还足以是 Sub 方法 (Visual Basic) 或具有 void 再次回到类型 (C#)。 该再次来到类型重要用于定义必要 void 重返类型的事件管理程序。 异步事件管理程序经常作为异步程序的起先点。

异步方法还足以是 Sub 方法 (Visual Basic) 或具有 void 重回类型 (C#)。 该重返类型首要用来定义供给 void 再次回到类型的事件处理程序。 异步事件管理程序平时作为异步程序的起头点。

无能为力等待为 Sub 程序或富有 void 再次来到类型的异步方法,并且无效的回到方法的调用方不能捕获该方法引发的别的极其。

无能为力等待为 Sub 程序或具备 void 重回类型的异步方法,何况无效的归来方法的调用方不能够捕获该情势引发的别的相当。

异步方法不可能评释Visual Basic 中的 ByRef 参数或 C# 中的 ref 或 out 参数,但此措施能够调用具有此类参数的措施。

异步方法不能够注明Visual Basic 中的 ByRef 参数或 C# 中的 ref 或 out 参数,但此办法能够调用具备此类参数的法子。

关于越来越多音讯和示范,请参见异步重返类型(C# 和 Visual Basic)。 有关怎么着在异步方法中捕捉卓殊的更加多新闻,请参阅try-catch(C# 参考)或Try...Catch...Finally 语句 (Visual Basic)。

关于更多新闻和示范,请参见异步重回类型(C# 和 Visual Basic)。 有关怎么着在异步方法中捕捉十分的越来越多新闻,请参阅try-catch(C# 参考)或Try...Catch...Finally 语句 (Visual Basic)。

Windows 运营时编程中的异步 API 具备下列重返类型之一,它相仿于职务:

Windows 运营时编制程序中的异步 API 具备下列再次来到类型之一,它好像于职分:

  • IAsyncOperation,它对应于 Task<TResult>

  • IAsyncAction,它对应于 Task

  • IAsyncActionWithProgress

  • IAsyncOperationWithProgress

  • IAsyncOperation,它对应于 Task<TResult>

  • IAsyncAction,它对应于 Task

  • IAsyncActionWithProgress

  • IAsyncOperationWithProgress

有关更加多新闻和演示,请参见高速入门:将 await 运算符用于异步编制程序。

关于越来越多音讯和演示,请参见立即入门:将 await 运算符用于异步编制程序。

取名约定

取名约定

 

 

 

 

服从约定,将“Async”追加到持有 Async 或 async 修饰符的艺术的名称。

遵守预定,将“Async”追加到具有 Async 或 async 修饰符的办法的称谓。

假若某一约定中的事件、基类或接口协定提议任何名目,则能够忽略此预约。 例如,你不应重命名常用事件管理程序,比如 Button1_Click。

万一某一约定中的事件、基类或接口协定建议其余名目,则足以忽略此预订。 比方,你不应重命名常用事件管理程序,举例 Button1_Click。

有关主题

连带宗旨

标题

描述

示例

演练:使用 Async 和 Await 访问 Web(C# 和 Visual Basic)

演示如何将一个同步 WPF 解决方案转换成一个异步 WPF 解决方案。 应用程序下载一系列网站。

异步示例:访问 Web 演练(C# 和 Visual Basic)

如何:使用 Task.WhenAll 扩展异步演练(C# 和 Visual Basic)

将 Task.WhenAll 添加到上一个演练。 使用 WhenAll 同时启动所有下载。

 

如何:使用 Async 和 Await 并行发起多个 Web 请求(C# 和 Visual Basic)

演示如何同时开始几个任务。

异步示例:并行发出多个 Web 请求(C# 和 Visual Basic)

异步返回类型(C# 和 Visual Basic)

描述异步方法可返回的类型,并解释每种类型适用于的情况。

 

异步程序中的控制流(C# 和 Visual Basic)

通过异步程序中的一系列 await 表达式来详细跟踪控制流。

异步示例:异步程序中的控制流(C# 和 Visual Basic)

微调异步应用程序(C# 和 Visual Basic)

演示如何将以下功能添加到异步解决方案:

异步示例:微调应用程序(C# 和 Visual Basic)

处理异步应用程序中的重入(C# 和 Visual Basic)

演示如何处理有效的异步操作在运行时重启的情况。

 

WhenAny:.NET Framework 和 Windows 运行时之间的桥接(C# 和 Visual Basic)

演示如何桥接 .NET Framework 中的任务类型和 Windows 运行时中的 IAsyncOperations,以便你可以将 WhenAny<TResult> 与 Windows 运行时方法结合使用。

异步示例:桥接 .NET 和 Windows 运行时(AsTask 和 WhenAny)

异步取消:.NET Framework 和 Windows 运行时之间的桥接(C# 和 Visual Basic)

演示如何桥接 .NET Framework 中的任务类型和 Windows 运行时 中的 IAsyncOperation,以便你可以将 CancellationTokenSource 与 Windows 运行时 方法结合使用。

异步示例:桥接 .NET 和 Windows 运行时(AsTask 和取消)

使用异步进行文件访问(C# 和 Visual Basic)

列出并演示使用 async 和 await 访问文件的好处。

 

演练:将调试器与异步方法一起使用

演示 await 语句上的控制流,并演示异步方法中的“逐语句”、“逐过程”和“跳出”命令的行为。

 

Task-based Asynchronous Pattern (TAP)

描述 .NET Framework 中异步的新模式。 该模式基于 Task 和Task<TResult> 类型。

 

快速入门:在 C# 或 Visual Basic 中调用异步 API

演示如何在 Windows 8.x 应用商店应用中使用 async 和 await。

 

异步编程(Windows 应用商店应用)

概述了 Windows 运行时中的异步编程。

 

第 9 频道上的异步视频

提供指向有关异步编程的各种视频的链接。

 

标题

描述

示例

演练:使用 Async 和 Await 访问 Web(C# 和 Visual Basic)

演示如何将一个同步 WPF 解决方案转换成一个异步 WPF 解决方案。 应用程序下载一系列网站。

异步示例:访问 Web 演练(C# 和 Visual Basic)

如何:使用 Task.WhenAll 扩展异步演练(C# 和 Visual Basic)

将 Task.WhenAll 添加到上一个演练。 使用 WhenAll 同时启动所有下载。

 

如何:使用 Async 和 Await 并行发起多个 Web 请求(C# 和 Visual Basic)

演示如何同时开始几个任务。

异步示例:并行发出多个 Web 请求(C# 和 Visual Basic)

异步返回类型(C# 和 Visual Basic)

描述异步方法可返回的类型,并解释每种类型适用于的情况。

 

异步程序中的控制流(C# 和 Visual Basic)

通过异步程序中的一系列 await 表达式来详细跟踪控制流。

异步示例:异步程序中的控制流(C# 和 Visual Basic)

微调异步应用程序(C# 和 Visual Basic)

演示如何将以下功能添加到异步解决方案:

异步示例:微调应用程序(C# 和 Visual Basic)

处理异步应用程序中的重入(C# 和 Visual Basic)

演示如何处理有效的异步操作在运行时重启的情况。

 

WhenAny:.NET Framework 和 Windows 运行时之间的桥接(C# 和 Visual Basic)

演示如何桥接 .NET Framework 中的任务类型和 Windows 运行时中的 IAsyncOperations,以便你可以将 WhenAny<TResult> 与 Windows 运行时方法结合使用。

异步示例:桥接 .NET 和 Windows 运行时(AsTask 和 WhenAny)

异步取消:.NET Framework 和 Windows 运行时之间的桥接(C# 和 Visual Basic)

演示如何桥接 .NET Framework 中的任务类型和 Windows 运行时 中的 IAsyncOperation,以便你可以将 CancellationTokenSource 与 Windows 运行时 方法结合使用。

异步示例:桥接 .NET 和 Windows 运行时(AsTask 和取消)

使用异步进行文件访问(C# 和 Visual Basic)

列出并演示使用 async 和 await 访问文件的好处。

 

演练:将调试器与异步方法一起使用

演示 await 语句上的控制流,并演示异步方法中的“逐语句”、“逐过程”和“跳出”命令的行为。

 

Task-based Asynchronous Pattern (TAP)

描述 .NET Framework 中异步的新模式。 该模式基于 Task 和Task<TResult> 类型。

 

快速入门:在 C# 或 Visual Basic 中调用异步 API

演示如何在 Windows 8.x 应用商店应用中使用 async 和 await。

 

异步编程(Windows 应用商店应用)

概述了 Windows 运行时中的异步编程。

 

第 9 频道上的异步视频

提供指向有关异步编程的各种视频的链接。

 

完整的示范

全部的自己要作为楷模遵从规则

 

 

 

 

下边包车型大巴代码是源于于本宗旨探究的 Windows Presentation Foundation (WPF) 应用程序的 MainWindow.xaml.vb 或 MainWindow.xaml.cs 文件。 能够从 异步示例:“使用 Async 和 Await 实行异步编制程序”的自己要作为轨范遵守规则中下载示例。

上边包车型地铁代码是根源于本核心研究的 Windows Presentation Foundation (WPF) 应用程序的 MainWindow.xaml.vb 或 MainWindow.xaml.cs 文件。 能够从 异步示例:“使用 Async 和 Await 举行异步编程”的示范中下载示例。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Windows;
 7 using System.Windows.Controls;
 8 using System.Windows.Data;
 9 using System.Windows.Documents;
10 using System.Windows.Input;
11 using System.Windows.Media;
12 using System.Windows.Media.Imaging;
13 using System.Windows.Navigation;
14 using System.Windows.Shapes;
15 
16 // Add a using directive and a reference for System.Net.Http;
17 using System.Net.Http;
18 
19 namespace AsyncFirstExample
20 {
21     public partial class MainWindow : Window
22     {
23         // Mark the event handler with async so you can use await in it.
24         private async void StartButton_Click(object sender, RoutedEventArgs e)
25         {
26             // Call and await separately.
27             //Task<int> getLengthTask = AccessTheWebAsync();
28             //// You can do independent work here.
29             //int contentLength = await getLengthTask;
30 
31             int contentLength = await AccessTheWebAsync();
32 
33             resultsTextBox.Text  =
34                 String.Format("rnLength of the downloaded string: {0}.rn", contentLength);
35         }
36 
37 
38         // Three things to note in the signature:
39         //  - The method has an async modifier. 
40         //  - The return type is Task or Task<T>. (See "Return Types" section.)
41         //    Here, it is Task<int> because the return statement returns an integer.
42         //  - The method name ends in "Async."
43         async Task<int> AccessTheWebAsync()
44         { 
45             // You need to add a reference to System.Net.Http to declare client.
46             HttpClient client = new HttpClient();
47 
48             // GetStringAsync returns a Task<string>. That means that when you await the
49             // task you'll get a string (urlContents).
50             Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
51 
52             // You can do work here that doesn't rely on the string from GetStringAsync.
53             DoIndependentWork();
54 
55             // The await operator suspends AccessTheWebAsync.
56             //  - AccessTheWebAsync can't continue until getStringTask is complete.
57             //  - Meanwhile, control returns to the caller of AccessTheWebAsync.
58             //  - Control resumes here when getStringTask is complete. 
59             //  - The await operator then retrieves the string result from getStringTask.
60             string urlContents = await getStringTask;
61 
62             // The return statement specifies an integer result.
63             // Any methods that are awaiting AccessTheWebAsync retrieve the length value.
64             return urlContents.Length;
65         }
66 
67 
68         void DoIndependentWork()
69         {
70             resultsTextBox.Text  = "Working . . . . . . .rn";
71         }
72     }
73 }
74 
75 // Sample Output:
76 
77 // Working . . . . . . .
78 
79 // Length of the downloaded string: 41564.
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Windows;
 7 using System.Windows.Controls;
 8 using System.Windows.Data;
 9 using System.Windows.Documents;
10 using System.Windows.Input;
11 using System.Windows.Media;
12 using System.Windows.Media.Imaging;
13 using System.Windows.Navigation;
14 using System.Windows.Shapes;
15 
16 // Add a using directive and a reference for System.Net.Http;
17 using System.Net.Http;
18 
19 namespace AsyncFirstExample
20 {
21     public partial class MainWindow : Window
22     {
23         // Mark the event handler with async so you can use await in it.
24         private async void StartButton_Click(object sender, RoutedEventArgs e)
25         {
26             // Call and await separately.
27             //Task<int> getLengthTask = AccessTheWebAsync();
28             //// You can do independent work here.
29             //int contentLength = await getLengthTask;
30 
31             int contentLength = await AccessTheWebAsync();
32 
33             resultsTextBox.Text  =
34                 String.Format("rnLength of the downloaded string: {0}.rn", contentLength);
35         }
36 
37 
38         // Three things to note in the signature:
39         //  - The method has an async modifier. 
40         //  - The return type is Task or Task<T>. (See "Return Types" section.)
41         //    Here, it is Task<int> because the return statement returns an integer.
42         //  - The method name ends in "Async."
43         async Task<int> AccessTheWebAsync()
44         { 
45             // You need to add a reference to System.Net.Http to declare client.
46             HttpClient client = new HttpClient();
47 
48             // GetStringAsync returns a Task<string>. That means that when you await the
49             // task you'll get a string (urlContents).
50             Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
51 
52             // You can do work here that doesn't rely on the string from GetStringAsync.
53             DoIndependentWork();
54 
55             // The await operator suspends AccessTheWebAsync.
56             //  - AccessTheWebAsync can't continue until getStringTask is complete.
57             //  - Meanwhile, control returns to the caller of AccessTheWebAsync.
58             //  - Control resumes here when getStringTask is complete. 
59             //  - The await operator then retrieves the string result from getStringTask.
60             string urlContents = await getStringTask;
61 
62             // The return statement specifies an integer result.
63             // Any methods that are awaiting AccessTheWebAsync retrieve the length value.
64             return urlContents.Length;
65         }
66 
67 
68         void DoIndependentWork()
69         {
70             resultsTextBox.Text  = "Working . . . . . . .rn";
71         }
72     }
73 }
74 
75 // Sample Output:
76 
77 // Working . . . . . . .
78 
79 // Length of the downloaded string: 41564.

请参阅

请参阅

 

 

 

 

async(C# 参考)
await(C# 参考)
Await 运算符 (Visual Basic)
Async (Visual Basic)
示范:.NET 异步编制程序(Windows 应用公司应用)
示例:生成 await WebClient
示例 (C#):将集中保存到应用程序存款和储蓄
示例 (Visual Basic):将聚合保存到应用程序存款和储蓄

async(C# 参考)
await(C# 参考)
Await 运算符 (Visual Basic)
Async (Visual Basic)
示范:.NET 异步编制程序(Windows 应用商城应用)
示例:生成 await WebClient
示例 (C#):将聚合保存到应用程序存款和储蓄
示例 (Visual Basic):将集中保存到应用程序存款和储蓄

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站的异步编制程序