澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

的异步编制程序

2019-12-12 作者:www.8455.com   |   浏览(138)

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

【博主】反骨仔    【出处】   

见到Microsoft官方风度翩翩篇有关异步编制程序的篇章,感到非常好,不敢独享,共享给大家。

目录

  • 异步编程的简介
  • 异步提升响应本领
  • 更便于编写的异步方法
  • 异步方法的调整流(核心)
  • 异步中的线程
  • async 和 await 修饰符
  • 归来类型和参数新闻
  • 命名的预约

 

原来的文章地址:

一、异步编制程序的简介

  通过采用异步编制程序,你可防止止质量瓶颈并进步你的应用程序的总体响应手艺。

  从 VS 二〇一一 发轫,新引进了三个简化的秘诀,称为异步编制程序。大家在 >= .NET 4.5 仲春 Windows 运转时中应用异步,编写翻译器它会帮衬了大家减少了后生可畏度实行的高难度异步代码编写的做事,但逻辑构造却临近于同台代码。由此,大家仅须要实行一小部分编制程序的劳作就可以收获异步编制程序的装有优点。

 

通过运用异步编制程序,你能够幸免品质瓶颈并提升应用程序的总体响应本领。 不过,编写异步应用程序的传统本事可能相比复杂,使它们难以编写、调节和测量试验和护卫。

二、异步升高响应本事

  异步对大概引起短路的位移(如访问Web 时),对 Web 能源的拜望一时过慢或推迟过高。若这种职责在一块儿进度中受阻,则整个应用程序必须等待响应完毕。 在运用异步的进度中,我们的应用程序可继续施行不相信任Web 财富的别样职业,并会间接等候绿灯的天职顺利完毕。

  那是局地超人的施用异步的施用处景,以至部分在 .NET >= 4.5 后新增添的类库。

图片 1

  全数与客户分界面相关的操作平日分享三个线程,所以接收异步对于使用 UI 线程的 App 来说是相当关键的。

  如若说你的 App 全体操作都以一路的,相当于说,当三个线程现身拥塞,别的线程都会产出窒碍,更要紧的是, App 会截至响应。

图片 2

 

  使用异步方法时,App 将三回九转响应 UI。如:最大和最小化,但是意义依然在后台施行(如:下载)。

 

Visual Studio 2013 引进了七个简化的法子(即异步编制程序),该措施运用 .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(卡塔尔(英语:State of Qatar)),你能够用这么的法子来简化代码。

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 就足以了,剩余的其他事情,就留给编写翻译器吧。 

 

本大旨概述了几时以致如何使用异步编制程序,并富含针对包罗详细音信和示范的扶植大旨的链接。

四、异步方法的调整流(核心)

  异步编制程序中最要害却不易懂的是调控流,即差异方法间的切换。以往,请用朝气蓬勃颗感恩的心来察看下图。

图片 3

  步骤剖析:

  ① 事件管理程序调用并听候 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卡塔尔(英语:State of Qatar) 已到位,并且 AccessTheWebSync 不必等待最后结果,则挂起接下来重返到 AccessTheWebAsync,但那会产生开支的疏落。

  在调用方内部(倘若这是八个事件管理程序),管理情势将继续。在等候结果前,调用方能够拓宽不依赖于于 AccessTheWebAsync 结果的别样专门的学业,不然就需等候片刻。事件管理程序等待 AccessTheWebAsync,而 AccessTheWebAsync 等待 GetStringAsync。

  ⑦ GetStringAsync 完结并生成三个字符串结果。 字符串结果不是经过你预期的不二法门调用 GetStringAsync 所重回的。(请记住,此格局已在步骤 3 中回到叁个任务。)相反,字符串结果存储在象征完结措施 getStringTask 的职务中。 await 运算符从 getStringTask 中追寻结果。赋值语句将寻觅到的结果赋给 urlContents。

  ⑧ 当 AccessTheWebAsync 具备字符串结果时,该办法能够测算字符串长度。然后,AccessTheWebAsync 职业也将产生,何况等待事件管理程序可继续使用。 

 

  你能够品味思谋一下合伙行为和异步行为之间的异样。当其行事做到时(第 5 步)会回到多个齐声方法,但当其专门的学问挂起时(第 3 步和第 6 步),异步方法会重回三个职责值。在异步方法最后成功其工作时,职责会标志为已做到,而结果(尽管有)将储存在职务中。

 

异步进步响应工夫

五、异步中的线程

  异步方法旨在成为非梗塞操作。异步方法中的 await 表达式在伺机的职务实施的还要不会窒碍当前线程。相反,await 表明式在继续试行时方法的别的部分并将调节权重回到异步方法的调用方。

  async 和 await 关键字不会以致成立其余线程。因为异步方法不会在其本身线程上运维,由此它无需三十多线程。独有当方法处于活动状态时,该方式将在现阶段一齐上下文中运作并使用线程上的时光。能够使用 Task.Run 将占用大量CPU 的干活移到后台线程,但是后台线程不会扶持正在等候结果的进度变为可用状态。

  对于异步编制程序来讲,该基于异步的章程优于大概各类用例中的现存措施。具体来讲,此办法比 BackgroundWorker 更适用于 IO 绑定的操作,因为此代码更简单且无需预防当先争用口径。结合 Task.Run(卡塔尔使用时,异步编制程序比 BackgroundWorker 更适用于 CPU 绑定的操作,因为异步编制程序将运营代码的协和细节与 Task.Run 传输至线程池的劳作分别开来。

 

 

六、async 和 await 修饰符

  当您使用 async 修饰符内定该方式为异步方法时:

  • 能够行使 await 来钦点悬挂点。await 运算符会告诉编写翻译器,异步方法唯有直到等待的异步进程施行到位,才具世袭透过该点往下进行。同期,调节权将再次来到至异步方法的调用方。await 表明式中异步方法在挂起后,假若该措施还不曾施行到位并脱离,finally 块中的将不会推行。

  • 标志的异步方法自身能够透过调用它的主意开展等待。异步方法中国和扶桑常富含三个或四个await 运算符,当然,多个 await 表明式都不设有也不会引致编写翻译器错误,可是编写翻译器会生出警示,该措施在试行的时候照旧会鲁人持竿同步方法来进行,async 其实只是多个标识的效能而已,告诉编写翻译器他“应该”是几个异步方法。

 

 

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

  在编辑异步方法时,我们多方会选用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 关键字,可是异步方法能够调用富含那些参数的点子。

 

异步对恐怕孳生短路的位移(例如应用程序访问Web 时)至关心珍视要。 对 Web 财富的访谈有时异常的慢或会延迟。 假如此类活动在联合进度中受阻,则整个应用程序必得等待。 在异步进程中,应用程序可继续试行不依赖Web 财富的其它干活,直至潜在阻止任务到位。

八、命名的约定

  根据预定,使用 async 的方法都应有以“Async”作为后缀,如:DownloadAsync(卡塔尔 。但是,要是某后生可畏约定中的事件、基类或接口有其余的样式约定,则能够忽视上述约定。比如,不应有修正或重命名常用事件管理程序,如 btnOpen_Click。

 

下表显示了异步编程升高响应工夫的特出应用处景。 从 .NET Framework 4.5 和 Windows 运行时中列出的 API 包涵扶助异步编制程序的法子。

传送门 

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

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

  3. 走进异步编制程序的社会风气 - 分析异步方法(下)

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

 


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

【参考】

 

应用程序区域

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

Web 访问

HttpClient SyndicationClient

使用文件

StorageFileStreamWriterStreamReaderXmlReader

使用图像

MediaCaptureBitmapEncoderBitmapDecoder

WCF 编程

同步和异步操作

   

鉴于负有与顾客分界面相关的移动通常共享八个线程,由此,异步对寻访UI 线程的应用程序来讲更是主要。 借使别的进程在意气风发道应用程序中受阻,则有着进度都将受阻。 你的应用程序停止响应,因而,你也许在其等待历程中认为它已经停业。

运用异步方法时,应用程序将延续响应 UI。 比方,你能够调动窗口的抑扬顿挫或最小化窗口;若是您不期望等待应用程序截止,则足以将其停业。

当设计异步操作时,该基于异步的艺术将自行传输的等同对象增加到可从当中筛选的选项列表中。 开垦人士只供给投入少之甚少的工作量就能够令你获取守旧异步编制程序的有所优点。

异步方法更易于编写

 

 

Visual Basic 中的 Async 和 Await 关键字,以及 C# 中的 async 和 await 关键字都是异步编制程序的中坚。 通过应用那七个主要字,你能够利用 .NET framework 或 Windows 运转时中的能源轻易创立异步方法(大致与创制同步方法生龙活虎致轻巧)。 通过运用被喻为异步方法的 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 }

借使 AccessTheWebAsync 在调用 GetStringAsync 和等候其成就时期无法拓宽此外专门的学业,则你能够通过在底下的单个语句中调用和等候来简化代码。

1 string urlContents = await client.GetStringAsync();

以下特点计算了使上三个演示成为异步方法的来头。

  • 艺术具名富含三个 Async 或 async 修饰符。

  • 遵从约定,异步方法的名目以“Async”后缀为尾声。

  • 归来类型为下列项目之黄金时代:

    • 倘令你的不二等秘书诀有操作数为 TResult 类型的回来语句,则为 Task<TResult>。

    • 大器晚成旦你的办法没有回来语句或有所未有操作数的归来语句,则为 Task。

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

    关于详细音信,请参见本宗旨前面包车型地铁“重回类型和参数”。

  • 方法日常包涵起码叁个await 表达式,该表明式标志叁个点,在该点上,直到等待的异步操作落成议程技巧继续。 同偶尔候,将艺术挂起,而且控件再次来到到艺术的调用方。 本主旨的下风流洒脱节将表达悬挂点产生的图景。

在异步方法中,可采纳提供的要害字和体系来提示需求形成的操作,且编写翻译器会达成其它操作,此中囊括不断追踪控件以挂起方法重临等待点时爆发的动静。 一些常规流程(举个例子,循环和这几个处理)在传统异步代码中拍卖起来可能非常不方便。 在异步方法中,成分的编纂频率与共同解决方案相似且此主题素材拿到缓和。

有关 .NET Framework 早先时期版本中的异步的越来越多音讯,请参见 TPL and Traditional .NET Framework Asynchronous Programming。

异步方法中发出的作业

 

 

异步编制程序中最需弄清的是调控流是什么样从事艺术工作术移动到艺术的。 下图可指引您做到该进程。

图片 4

关系图中的数值对应于以下步骤。

  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 步),异步方法会再次回到一个职责值。 在异步方法最终变成其行事时,任务会标志为已成功,而结果(假设有)将储存在任务中。

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

API 异步方法

 

 

你可能想清楚从哪处能够找到 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)。

线程

 

 

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

async 和 await 关键字不会变成创制其余线程。 因为异步方法不会在其自身线程上运维,因而它没有必要二十四线程。 只有当方法处于活动状态时,该措施将要这时候此刻联合上下文中运维并接纳线程上的时辰。 能够选择 Task.Run 将侵吞大批量CPU 的工作移到后台线程,可是后台线程不会援助正在守候结果的经过变为可用状态。

对此异步编程来说,该基于异步的格局优于差不离每一种用例中的现存措施。 具体来说,此情势比 BackgroundWorker 更适用于 IO 绑定的操作,因为此代码更轻松且不供给防守争用标准。 结合 Task.Run 使用时,异步编制程序比 BackgroundWorker 更适用于 CPU 绑定的操作,因为异步编制程序将运维代码的和睦细节与 Task.Run 传输至线程池的劳作分别开来。

异步和等候

 

 

意气风发旦因而动用 Async 或 async 修饰符钦命某种方式为异步方法,则足以启用以下五个职能。

  • 标志的异步方法能够运用 Await 或 await 来钦定悬挂点。 await 运算符布告编译器异步方法独有直到等待的异步进程一刀两断本事三番三遍透过该点。同一时间,控件重临至异步方法的调用方。

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

  • 标识的异步方法本人能够由此调用它的艺术等待。

异步方法平常包涵await 运算符的叁个或多个相称项,但缺少 await 表明式不会促成编译器错误。 假诺异步方法未利用 await 运算符标志悬挂点,则该格局将作为协同方法实践,不管异步修饰符怎么样。 编写翻译器将为此类措施发表一个告诫。

AsyncasyncAwait 和 await 都以左右文关键字。 有关越来越多信息和演示,请参见以下主旨:

  •  Async (Visual Basic)

  • 的异步编制程序。async(C# 参考)

  • Await 运算符 (Visual Basic)

  • await(C# 参考)

归来类型和参数

 

 

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

举例措施包罗钦赐 TResult 类型的操作数的 Return (Visual Basic) 或 return (C#) 语句,则将 Task<TResult> 钦命为回到类型。

要是艺术不含任何 return 语句或带有不回来操作数的 return 语句,则将 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();

种种再次来到的任务表示正在开展的办事。 职务可包裹有关异步进度处境的新闻,如若未得逞,则最终会卷入来自进程的尾声结出或进度引发的老大。

异步方法还足以是 Sub 方法 (Visual Basic) 或具有 void 再次回到类型 (C#卡塔尔。 该再次来到类型主要用来定义须求 void 再次来到类型的事件管理程序。 异步事件管理程序平日作为异步程序的发轫点。

没辙等待为 Sub 程序或具有 void 重临类型的异步方法,並且无效的归来方法的调用方无法捕获该格局引发的别的特别。

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

有关越来越多音讯和示范,请参见异步重回类型(C# 和 Visual Basic)。 有关怎样在异步方法中捕捉分外的越来越多音信,请参阅try-catch(C# 参考)或Try...Catch...Finally 语句 (Visual Basic)。

Windows 运维时编制程序中的异步 API 具备下列重回类型之生机勃勃,它好像于任务:

  • IAsyncOperation,它对应于 Task<TResult>

  • IAsyncAction,它对应于 Task

  • IAsyncActionWithProgress

  • IAsyncOperationWithProgress

至于越来越多新闻和演示,请参见迅猛入门:将 await 运算符用于异步编制程序。

取名约定

 

 

依据约定,将“Async”追加到持有 Async 或 async 修饰符的方法的名称。

假若某风流洒脱约定中的事件、基类或接口协定提出其余名目,则足以忽视此预约。 比方,你不应重命名常用事件管理程序,比如 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 频道上的异步视频

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

 

完整的示范

 

 

上面包车型客车代码是源于于本大旨钻探的 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.

请参阅

 

 

async(C# 参考)
await(C# 参考)
Await 运算符 (Visual Basic)
Async (Visual Basic)
亲自去做:.NET 异步编制程序(Windows 应用公司应用)
示例:生成 await WebClient
示例 (C#卡塔尔(قطر‎:将集聚保存到应用程序存款和储蓄
示例 (Visual Basic卡塔尔(قطر‎:将集结保存到应用程序存款和储蓄

本文由澳门新萄京官方网站发布于www.8455.com,转载请注明出处:的异步编制程序

关键词: