【美高梅开户网址】出现编制程序经典实例,的异步编制程序

C# 5.0 推出async和await,最早是.NET Framework 四.伍引进,能够在Visual
Studio
二〇一二使用。在此之前的异步编制程序达成难度较高,async使异步编制程序的兑现变得简便。

看来Microsoft官方1篇有关异步编制程序的稿子,感觉挺好,不敢独享,分享给我们。

旁观Microsoft官方1篇有关异步编制程序的篇章,感觉挺好,不敢独享,分享给大家。

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

各平台对async的协理景况

原来的书文地址:

原稿地址:

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

【博主】反骨仔    【出处】   

平台 async
.NET 4.5及以上
.NET 4.0 NuGet
Mono iOS/Droid
Windows Store
Windows Phone Apps 8.1
Windows Phone SL 8.0
Windows Phone SL 7.1 NuGet
Silverlight 5 NuGet

通过运用异步编程,你能够避免品质瓶颈并坚实应用程序的全部响应能力。 可是,编写异步应用程序的历史观技术恐怕相比复杂,使它们难以编写、调节和测试和保卫安全。

由此选择异步编制程序,你能够制止质量瓶颈并进步应用程序的总体响应能力。 可是,编写异步应用程序的价值观技术恐怕比较复杂,使它们难以编写、调节和测试和维护。

目录

  • 异步编制程序的简介
  • 异步提升响应能力
  • 更便于编写的异步方法
  • 异步方法的控制流(宗旨)
  • 线程
  • async 和 await
  • 回去类型和参数音讯
  • 取名的预订

 

在不帮忙的平台,安装NuGet包 Microsoft.Bcl.Async

Visual
Studio 二零一一 引进了一个简化的点子(即异步编制程序),该方式运用 .NET
Framework 肆.五 和 Windows 运转时中的异步援助。 编译器可实施开发人士曾举行的高难度工作,且应用程序保留了四个近乎于1块代码的逻辑结构。 由此,你只需做一小部分工作就足以拿走异步编制程序的拥有好处。

Visual
Studio 二零一二 引进了多个简化的点子(即异步编制程序),该形式运用 .NET
Framework 四.5 和 Windows 运维时中的异步帮忙。 编写翻译器可进行开发职员曾进行的高难度工作,且应用程序保留了2个像样于壹块代码的逻辑结构。 因而,你只需做一小部分工作就足以博得异步编制程序的拥有好处。

壹、异步编制程序的简介

  通过利用异步编程,你能够幸免品质瓶颈并抓实应用程序的完好响应能力。

  Visual
Studio 二零一二 引进了二个简化的方法,异步编制程序,在 .NET Framework 4.5 和
Windows 运转时选拔异步扶助。编写翻译器可实施开发职员曾进行的高难度工作,且应用程序保留了二个类似于一块代码的逻辑结构。因而,您仅须求展开一小部分行事就能够收获异步编程的具备优点。

 

使用 async 修饰符可将艺术、lambda 说明式或匿有名的模特式钦赐为异步。

本大旨概述了哪一天以及哪些利用异步编制程序,并包含针对包涵详细音信和演示的支撑宗旨的链接。

本主旨概述了曾几何时以及怎么样利用异步编制程序,并包含针对包涵详细音讯和示范的协理核心的链接。

贰、异步升高响应能力

  异步对恐怕滋生短路的移位(例如应用程序访问
Web 时)至关心器重要。对
Web 能源的拜访有时相当的慢或会延迟。假诺此类活动在一道进程中受阻,则整个应用程序必须等待。 在异步进程中,应用程序可继续执行不依赖Web 能源的别样干活,直至潜在阻塞的天职成功。

  下图显示了异步编制程序升高响应能力的卓著应用场景。包含从
.NET Framework 4.五 和 Windows
运维时中列出的有个别涵盖扶助异步编制程序的艺术的类。

  由于有着与用户界面相关的移动壹般共享多少个线程,因而,异步对走访
UI 线程的应用程序来说特别重大。 倘使在三个齐声应用程序中有其余的线程被封堵了,那么全数线程都将被卡住,再严重一点,你的应用程序将会截止响应。

  使用异步方法时,应用程序将持续响应
UI。例如,你能够调动窗口的轻重或最小化窗口;若是您不期望等待应用程序截止,则能够将其倒闭。

 

async 对艺术做了什么样处理

从利用async修饰符修饰的方式的IL代码能够得出三个结论:

  • 在Debug下,针对async方法,生成的是三个class状态机
  • 在Release下,针对async方法,生成的是1个struct状态机

美高梅开户网址,举例:
C#代码如下

using System.Threading.Tasks;

namespace ConsoleApp3
{
    public class Test
    {
        public async Task TestAsync()
        {
            await GetAsync();
        }

        public async Task GetAsync()
        {
            await Task.Delay(1);
        }
    }
}

以TestAsync方法为准

Release下 起头化状态机V_0
,类型是值类型Struct(valuetype),类型名叫<TestAsync>d__0

    .locals init (
      [0] valuetype ConsoleApp3.Test/'<TestAsync>d__0' V_0,
      [1] valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder V_1
    )

<TestAsync>d__0 继承值类型[mscorlib]System.ValueType

.class nested private sealed auto ansi beforefieldinit 
    '<TestAsync>d__0'
      extends [mscorlib]System.ValueType
      implements [mscorlib]System.Runtime.CompilerServices.IAsyncStateMachine

Debug 下 初叶化状态机V_0 ,类型是引用类型Class(class)
,类型名为<TestAsync>d__0

    .locals init (
      [0] class ConsoleApp3.Test/'<TestAsync>d__0' V_0,
      [1] valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder V_1
    )

<TestAsync>d__0 继承引用类型[mscorlib]System.Object

  .class nested private sealed auto ansi beforefieldinit 
    '<TestAsync>d__0'
      extends [mscorlib]System.Object
      implements [mscorlib]System.Runtime.CompilerServices.IAsyncStateMachine

异步进步响应能力

异步提升响应能力

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

  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/");

  

  依照以上代码进行简要计算:

  (一)方法签名包括三个 async 修饰符。

  (贰)根据约定,异步方法的名目以“Async”后缀为尾声。

  (3)再次来到类型为下列项目之1:

    壹 要是您的法门有操作数为
TResult 类型的回到语句,则为 Task<TResult>。

    二 假设您的不二等秘书籍未有重返语句或具有未有操作数的归来语句,则为 Task。

    叁 假如您编写的是异步事件处理程序,则为
void。

  (四)方法一般包罗至少叁个await
表达式,该表明式标记七个点,在该点上,直到等待的异步操作实现章程才能继续。 同时,将艺术挂起,并且控制权将重临到方法的调用方。

  在异步方法中,可使用提供的首要性字和体系来提示要求做到的操作,且编写翻译器会成功其他操作。 

 

异步方法的概念和注意事项

使用 async 关键字定义的异步方法简称为“异步方法”。

注意事项:

  • 如果 async 关键字修改的主意不包涵 await
    表明式或言辞,则该格局将联合施行。 编写翻译器警告将文告你不包蕴 await
    语句的此外异步方法,因为这场馆可能意味着存在错误。
    请参阅编写翻译器警告(等级
    一)CS401四。
  • async 关键字是上下文关键字,原因在于只有当它修饰方法、lambda
    表明式或匿名方式时,它才是任重(Ren Zhong)而道远字。
    在颇具其余上下文中,都会将其解释为标识符。
  • 不要用 void 作为 async 方法的回到类型! async 方法能够回来
    void ,可是那仅限于编写事件处理程序。贰个1般性的 async
    方法假使没有重临值,要回到Task ,而不是 void
  • 肯定要制止使用Task.WaitTask<T>.Result
    方法,因为它们会造成死锁。倘使选拔了 async ,最佳就径直选用它。
  • 异步方法的参数不可能选拔outrefoutref
    再次来到的数目应借用Task<TResult> 重临,能够使用元组或自定义数据结构。

 

 

肆、异步方法的控制流(大旨)

  异步编制程序中最需弄清的是控制流,即如何从2个措施移动到另一个艺术,
请用壹颗感恩的心来察看下图。

  步骤解析:

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

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

  三假使 GetStringAsync 中生出了某种情状,本场所挂起了它的进度。可能必须等待网址下载或部分别的阻塞的位移。为制止阻塞财富,GetStringAsync 会将控制权出让给其调用方 AccessTheWebAsync。GetStringAsync 重返 Task,个中 TResult
为字符串,并且 AccessTheWebAsync 将任务分配给 getStringTask 变量。该职责表示调用 GetStringAsync 的正在进展的经过,当中承诺当工作成就时发出实际字符串值。

  肆 由于并未有等待 getStringTask,由此,AccessTheWebAsync 能够继续执行不依赖于 GetStringAsync 得出最后结出的别样职务。该任务由对伙同方法 DoIndependentWork 的调用表示。

  伍 DoIndependentWork 是成功其行事并重回其调用方的同步方法。

  6 AccessTheWebAsync 已形成工作,能够不受 getStringTask 的结果影响。 接下来,AccessTheWebAsync 要求总括并重回该下载字符串的长度,但该办法仅在富有字符串时才能估摸该值。因而,AccessTheWebAsync 使用3个 await
运算符来挂起其速度,并把控制权交给调用 AccessTheWebAsync 的法子。AccessTheWebAsync 将 Task<int> 再次回到至调用方。 该任务表示对发出下载字符串长度的平头结果的3个答应。

  【备注】假若 GetStringAsync(即 getStringTask)在 AccessTheWebAsync 等待前成功,则控制权会保留在 AccessTheWebAsync 中。 倘诺异步调用过程(getStringTask) 已形成,并且 AccessTheWebSync
不必等待最后结出,则挂起接下来回来到 AccessTheWebAsync,但那会导致资金财产的浪费。

  在调用方内部(倘若那是2个事件处理程序),处理形式将一连。在等候结果前,调用方能够拓展不依靠于 AccessTheWebAsync 结果的别的工作,不然就需等候片刻。事件处理程序等待 AccessTheWebAsync,而 AccessTheWebAsync 等待 GetStringAsync。

  七 GetStringAsync 达成并生成三个字符串结果。 字符串结果不是透过你预期的格局调用 GetStringAsync 所重回的。(请牢记,此方法已在步骤 三中回到三个任务。)相反,字符串结果存款和储蓄在象征完毕章程 getStringTask 的职务中。 await
运算符从 getStringTask 中摸索结果。赋值语句将追寻到的结果赋给 urlContents。

  捌 当 AccessTheWebAsync 具有字符串结果时,该办法能够总计字符串长度。然后,AccessTheWebAsync 工作也将不负众望,并且等待事件处理程序可继承运用。 

 

  你可以品味思量一下协助进行行为和异步行为之间的异样。当其行事成功时(第6 步)会重回二个体协会同方法,但当其工作挂起时(第 3 步和第 6步),异步方法会重返多少个职务值。在异步方法最后成就其工作时,职责会标记为已做到,而结果(如若有)将积存在职务中。

 

【美高梅开户网址】出现编制程序经典实例,的异步编制程序。异步方法的性状

  • 格局签名包罗 async 修饰符。
  • 依照预约,异步方法的名号以“Async”后缀结尾。
  • 回到类型为下列项目之1:
    • 借使您的秘籍有操作数为 TResult 类型的归来语句,则为
      Task<TResult>
    • 即使你的情势未有回到语句或享有没有操作数的回来语句,则为
      Task
    • void:倘若要编写异步事件处理程序。
    • 包含 GetAwaiter 方法的别的任何类型(自 C# 7.0 起)。
  • 艺术一般包罗至少三个 await
    表明式,该表明式标记1个点,在该点上,直到等待的异步操作达成章程才能继续。
    同时,将艺术挂起,并且决定重返到方法的调用方。

至于async和await具体的施行流程,方法什么日期挂起和释放,请参考异步程序中的控制流
(C#)

 

 

五、线程

  异步方法意在成为非阻塞操作。异步方法中的
await 表明式在伺机的义务正在运营时不会卡住当前线程。相反,表明式在后续时登记方式的其他部分并将控制权重返到异步方法的调用方。

  async
和 await 关键字不会招致创立其余线程。因为异步方法不会在其自小编线程上运维,因而它不须要八线程。只有当方法处于活动状态时,该方法将在日前一块上下文中运作并应用线程上的年华。可以利用 Task.Run 将占据大量CPU
的干活移到后台线程,但是后台线程不会支持正在等候结果的长河变为可用状态。

  对于异步编制程序而言,该基于异步的诀窍优于大约种种用例中的现有措施。具体而言,此办法比 BackgroundWorker 更适用于
IO 绑定的操作,因为此代码更简明且无需提防超过争用口径。结合 Task.Run 使用时,异步编制程序比 BackgroundWorker 更适用于
CPU 绑定的操作,因为异步编制程序将运营代码的协调细节与 Task.Run 传输至线程池的行事分别开来。

 

异步重返类型

地点提到 void 作为重返结果,适用于事件处理程序。
举例:

using System;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    public class TestVoidAsync
    {
        private event EventHandler<EventArgs> DoTest;

        public TestVoidAsync()
        {
            DoTest += DoTestEvent;
        }

        private static async void DoTestEvent(object sender, EventArgs e)
        {
            await Task.Delay(1000);
        }

        protected virtual void OnDoTest()
        {
            DoTest?.Invoke(this, EventArgs.Empty);
        }
    }
}

void 作为重临结果存在贰个害处:不或然捕获格外。

归来 void
的异步方法的调用方不能够捕获从该方法引发的非凡,且此类未经处理的非凡恐怕会促成应用程序故障。
固然回去 TaskTask<TResult>
的异步方法中现身格外,此十一分将积存于重返的任务中,并在等待该职务时再一次吸引。

通用的异步重回类型:

从 C# 柒.0 开首,异步方法可回到任何具有可访问的 GetAwaiter
方法的类型。

ValueTask<TResult>

Task 和 Task<TResult> 是引用类型,因而,品质关键路径中的内部存款和储蓄器分配会对质量发生负面影响,越发当分配出现在紧密循环中时。
协理通用重返类型意味着可回到轻量值类型(而不是援引类型),从而防止额外的内部存储器分配。

使用ValueTask<TResult>,必要添加NuGet包
System.Threading.Tasks.Extensions

ValueTask<TResult> 是struct值类型,Task 和 Task<TResult>
是class引用类型

异步对恐怕滋生短路的位移(例如应用程序访问
Web 时)至关心爱抚要。 对
Web 财富的走访有时相当慢或会延迟。 如若此类活动在1块儿进度中受阻,则全体应用程序必须等待。 在异步进程中,应用程序可继续执行不依赖Web 能源的其余工作,直至潜在阻止职分成功。

异步对或许引起短路的移动(例如应用程序访问
Web 时)至关心珍惜要。 对
Web 财富的拜访有时非常慢或会推迟。 假若此类活动在同步进度中受阻,则全体应用程序必须等待。 在异步进度中,应用程序可继续执行不重视Web 财富的别样工作,直至潜在阻止任务成功。

六、async 和 await

  假使由此运用 async 修饰符钦点某种格局为异步方法,则会产出下边二种境况。

  • 标志的异步方法能够利用 await 来钦定悬挂点。await
    运算符公告编写翻译器异步方法唯有直到等待的异步进度一挥而就才能连续通过该点。同时,控制权将回来至异步方法的调用方。

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

  • 标志的异步方法本人能够通过调用它的章程等待。

  异步方法1般包罗await 运算符的一个或多个相配项,但缺乏 await
表明式不会促成编写翻译器错误。若是异步方法未利用
await
运算符标记悬挂点,则该方法将作为共同方法执行,不管异步修饰符怎么着。编写翻译器将为此类措施发表一个告诫。

 

异步操作的生命周期

Task 类提供了异步操作的生命周期,且该周期由 TaskStatus 枚举表示。

状态 执行顺序 备注
Created 0 该任务已初始化,但尚未安排。
WaitingForActivation 1 该任务正在等待被.NET Framework infrastructure 内部激活和调度。
WaitingToRun 2 该任务已安排执行但尚未开始执行。
Running 3 任务正在运行但尚未完成。
WaitingForChildrenToComplete 4 任务已完成执行,并隐式等待附加的子任务完成。
RanToCompletion 5 任务已成功完成执行。
Canceled 6 引发 OperationCanceledException 异常,或者在任务开始执行之前取消
Faulted 7 由于未处理的异常,任务已完成。

Canceled 和
Faulted状态都会因为职分拾贰分导致转换为该情况。二者的区分如下:

只要标记的 IsCancellationRequested 属性重返false,恐怕格外的符号与任务的符号不兼容,则会将
OperationCanceledException 根据平日的不行来拍卖,从而致使职务转换为
Faulted 状态。 其它还要小心,别的越发的留存将也会促成职责转换为
Faulted 状态。 您可以在 Status 属性中得到已做到任务的情况。

参照作品:

  • async(C#
    参考)
  • 使用 Async 和 Await 的异步编制程序(C#)
  • 基于职分的异步形式(TAP)
  • 异步重返类型
    (C#)
  • 异步程序中的控制流
    (C#)
  • 任务撤废
  • 异步编程

下表展现了异步编制程序升高响应能力的杰出应用场景。 从
.NET Framework 四.5 和 Windows 运维时中列出的 API
包括扶助异步编制程序的法子。

下表呈现了异步编制程序升高响应能力的一级应用场景。 从
.NET Framework 四.伍 和 Windows 运维时中列出的 API
包罗援助异步编制程序的措施。

七、重临类型和参数消息

  在
.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 参数,但此办法可以调用具有此类参数的法子。

 

应用程序区域

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

Web 访问

HttpClient SyndicationClient

使用文件

StorageFileStreamWriterStreamReaderXmlReader

使用图像

MediaCaptureBitmapEncoderBitmapDecoder

WCF 编程

同步和异步操作

   

应用程序区域

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

Web 访问

HttpClient SyndicationClient

使用文件

StorageFileStreamWriterStreamReaderXmlReader

使用图像

MediaCaptureBitmapEncoderBitmapDecoder

WCF 编程

同步和异步操作

   

8、命名的约定

  依据约定,将“Async”追加到具备 async 修饰符的章程名称。

  假若某1约定中的事件、基类或接口协定提议任何名目,则足以忽略此预约。例如,你不应重命名常用事件处理程序,例如 btnOpen_Click。

 

鉴于全部与用户界面相关的活动一般共享一个线程,由此,异步对走访
UI 线程的应用程序来说更为重大。 要是别的进度在1齐应用程序中受阻,则具有进度都将受阻。 你的应用程序结束响应,因而,你也许在其等待历程中以为它曾经破产。

鉴于全部与用户界面相关的位移一般共享1个线程,因而,异步对走访
UI 线程的应用程序来说特别首要。 假如别的进度在联合应用程序中受阻,则有着进度都将受阻。 你的应用程序结束响应,由此,你大概在其等待进度中以为它曾经破产。

传送门 

 


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

 

 

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

利用异步方法时,应用程序将三番五次响应
UI。 例如,你能够调动窗口的高低或最小化窗口;假若您不期待等待应用程序甘休,则足以将其倒闭。

应用异步方法时,应用程序将继承响应
UI。 例如,你能够调整窗口的轻重或最小化窗口;如若你不希望等待应用程序甘休,则足以将其关闭。

当设计异步操作时,该基于异步的章程将电动传输的如出一辙对象添加到可从中选拔的选项列表中。 开发职员只供给投入较少的工作量即可使你收获古板异步编制程序的保有优点。

当设计异步操作时,该基于异步的主意将自动传输的同等对象添加到可从中挑选的选项列表中。 开发人士只需求投入较少的工作量即可使您收获守旧异步编制程序的装有优点。

异步方法更便于编写

异步方法更便于编写

 

 

 

 

Visual
Basic
中的 Async 和 Await 关键字,以及
C#
中的 async 和 await 关键字都以异步编制程序的主导。 通过使用那多个至关心重视要字,你能够应用
.NET framework 或 Windows
运营时中的能源轻松创设异步方法(差不多与创设同步方法1致自在)。 通过运用被称之为异步方法的
async 和 await 定义的异步方法。

Visual
Basic
中的 Async 和 Await 关键字,以及
C#
中的 async 和 await 关键字都以异步编制程序的中坚。 通过采取那八个基本点字,你可以运用
.NET framework 或 Windows
运行时中的资源轻松创制异步方法(差不多与创立同步方法同样轻松)。 通过动用被誉为异步方法的
async 和 await 定义的异步方法。

上边的演示演示了一种异步方法。 你应对代码中的大约全数情节都10分了然。 注释调出你添加的用来创立异步的作用。

下边包车型大巴言传身教演示了1种异步方法。 你应对代码中的大概全数剧情都杰出熟练。 注释调出你添加的用来创设异步的意义。

您能够在本宗旨的末尾找到完整的示范文件,并且能够从 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();

以下特征计算了使上3个示范成为异步方法的原委。

以下特点总括了使上三个示范成为异步方法的来由。

  • 艺术签名包涵三个 Async 或 async 修饰符。

  • 遵守预订,异步方法的名目以“Async”后缀为最终。

  • 归来类型为下列项目之1:

    • 假设你的秘诀有操作数为
      TResult
      类型的回来语句,则为 Task<TResult>。

    • 设若您的不二法门未有再次来到语句或持有未有操作数的回到语句,则为 Task。

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

    至于详细音讯,请参见本核心前面的“再次回到类型和参数”。

  • 格局一般包涵至少一个await
    表达式,该表达式标记2个点,在该点上,直到等待的异步操作实现措施展才能能继承。 同时,将艺术挂起,并且控件重临到方法的调用方。 本大旨的下1节将解释悬挂点发生的事态。

  • 方法签名包含1个 Async 或 async 修饰符。

  • 依据预定,异步方法的称号以“Async”后缀为最后。

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

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

    • 若是您的艺术未有重返语句或具有未有操作数的回来语句,则为 Task。

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

    有关详细新闻,请参见本宗旨后边的“再次来到类型和参数”。

  • 办法一般包罗至少一个await
    表达式,该表明式标记2个点,在该点上,直到等待的异步操作达成措施展才能能接二连三。 同时,将艺术挂起,并且控件重临到点子的调用方。 本焦点的下一节将表达悬挂点发生的情景。

在异步方法中,可选拔提供的根本字和种类来提醒必要形成的操作,且编写翻译器会达成别的操作,在那之中囊括不断跟踪控件以挂起方法重回等待点时发生的事态。 一些好端端流程(例如,循环和那几个处理)在传统异步代码中拍卖起来只怕很狼狈。 在异步方法中,成分的编纂频率与协助实行化解方案相同且此题材取得缓解。

在异步方法中,可选择提供的机要字和类型来提醒要求形成的操作,且编写翻译器会实现其它操作,个中囊括不断跟踪控件以挂起方法重回等待点时暴发的情形。 一些正常化流程(例如,循环和那么些处理)在守旧异步代码中拍卖起来大概很困难。 在异步方法中,成分的编写制定频率与壹块化解方案相同且此难点获得缓解。

关于
.NET Framework 早期版本中的异步的更加多消息,请参见 TPL and Traditional
.NET Framework Asynchronous
Programming。

关于
.NET Framework 早期版本中的异步的越多信息,请参见 TPL and Traditional
.NET Framework Asynchronous
Programming。

异步方法中产生的事体

异步方法中生出的作业

 

 

 

 

异步编制程序中最需弄清的是控制流是如何从点子移动到方式的。 下图可指引你完毕该进度。

异步编制程序中最需弄清的是控制流是怎样从事艺术工作术移动到点子的。 下图可引导您完了该进程。

美高梅开户网址 1

美高梅开户网址 2

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

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

  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 使用1个 await
    运算符来挂起其速度,并把控制权交给调用 AccessTheWebAsync 的法门。AccessTheWebAsync 将 Task(Of
    Integer)
     或 Task<int> 重回至调用方。 该任务表示对爆发下载字符串长度的平头结果的三个承诺。

    注意

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

    在调用方内部(此示例中的事件处理程序),处理形式将延续。 在守候结果前,调用方能够开始展览不重视于 AccessTheWebAsync 结果的其他工作,不然就需静观其变片刻。 事件处理程序等待 AccessTheWebAsync,而 AccessTheWebAsync 等待 GetStringAsync

  7. GetStringAsync 完成并生成2个字符串结果。 字符串结果不是由此按您预期的法子调用 GetStringAsync 所再次回到的。 (记住,该办法已回到步骤
    3 中的3个任务)。 相反,字符串结果存款和储蓄在代表达成 getStringTask 方法的职务中。 await
    运算符从 getStringTask 中找寻结果。赋值语句将寻找到的结果赋给 urlContents。

  8. 当 AccessTheWebAsync 具有字符串结果时,该措施能够计算字符串长度。 然后,AccessTheWebAsync 工作也将不负众望,并且等待事件处理程序可继续选择。 在此核心结尾处的一体化示例中,可确认事件处理程序检索并打字与印刷长度结果的值。

比方您面生异步编制程序,请花
1 分钟时间思考共同行为和异步行为之间的异样。 当其工作形成时(第陆 步)会回到三个齐声方法,但当其行事挂起时(第 3 步和第 六步),异步方法会重临四个职务值。 在异步方法最后马到成功其行事时,职责会标记为已形成,而结果(假诺有)将积存在义务中。

假诺您面生异步编制程序,请花
1 分钟时间思索共同行为和异步行为之间的差异。 当其行事成功时(第陆 步)会回来3个1并方法,但当其工作挂起时(第 三 步和第 6步),异步方法会重返三个任务值。 在异步方法最终马到功成其行事时,职责会标记为已到位,而结果(如若有)将积存在职责中。

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

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

API 异步方法

API 异步方法

 

 

 

 

你大概想知道从何方能够找到 GetStringAsync 等支撑异步编程的不二法门。.NET
Framework 4.伍 包蕴使用 async 和 await 的重重分子。 能够经过附加到成员名称的“Async”后缀和 Task 或 Task<TResult> 的回到类型识别这几个分子。 例如,System.IO.Stream
类包括的诀要CopyToAsync、ReadAsync、WriteAsync 等办法以及一块方法 CopyTo、Read 和 Write。

您可能想掌握从哪儿可以找到 GetStringAsync 等支持异步编制程序的法子。.NET
Framework 四.伍 包涵使用 async 和 await 的浩大成员。 能够透过附加到成员名称的“Async”后缀和 Task 或 Task<TResult> 的归来类型识别那几个成员。 例如,System.IO.Stream
类包蕴的措施CopyToAsync、ReadAsync、WriteAsync 等方式以及联合方法 CopyTo、Read 和 Write。

Windows
运维时还带有众多在 Windows 八.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 关键字不会导致成立别的线程。 因为异步方法不会在其自小编线程上运营,因而它不需求10二线程。 唯有当方法处于活动状态时,该措施将在现阶段一起上下文中运作并选取线程上的刻钟。 能够使用 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 运算符的1个或多少个相配项,但缺少 await
表明式不会招致编写翻译器错误。 如若异步方法未采纳await
运算符标记悬挂点,则该方式将用香港作家联谊会见实行方法执行,不管异步修饰符怎样。 编写翻译器将为此类措施发布三个警戒。

异步方法1般包含await 运算符的3个或八个相配项,但缺少 await
表明式不会造成编写翻译器错误。 如若异步方法未使用
await
运算符标记悬挂点,则该办法将用作壹道方法执行,不管异步修饰符怎么样。 编写翻译器将为此类措施宣布2个警示。

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
编制程序中,异步方法1般再次回到 Task 或 Task<TResult>。 在异步方法中,await
运算符应用于通过调用另三个异步方法重返的天职。


.NET Framework
编制程序中,异步方法1般重返 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();

每一个再次回到的任务表示正在进行的工作。 职务可包裹有关异步进程景况的新闻,假设未中标,则末了会卷入来自进度的末段结出或进度引发的卓殊。

每一种重回的天职表示正在展开的行事。 职务可包裹有关异步进度情状的音讯,假若未得逞,则最终会卷入来自进度的终极结出或进度引发的那2个。

异步方法还足以是 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 具有下列再次来到类型之1,它就像是于职务:

  • IAsyncOperation,它对应于 Task<TResult>

  • IAsyncAction,它对应于 Task

  • IAsyncActionWithProgress

  • IAsyncOperationWithProgress

  • IAsyncOperation,它对应于 Task<TResult>

  • IAsyncAction,它对应于 Task

  • IAsyncActionWithProgress

  • IAsyncOperationWithProgress

至于更加多新闻和示范,请参见急迅入门:将
await
运算符用于异步编制程序。

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

取名约定

取名约定

 

 

 

 

遵循预订,将“Async”追加到全数 Async 或 async 修饰符的主意的称呼。

依据预定,将“Async”追加到拥有 Async 或 async 修饰符的不二诀要的名号。

要是某壹约定中的事件、基类或接口协定提出其余名目,则可以忽略此预约。 例如,你不应重命名常用事件处理程序,例如 Button一_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("\r\nLength of the downloaded string: {0}.\r\n", 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 . . . . . . .\r\n";
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("\r\nLength of the downloaded string: {0}.\r\n", 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 . . . . . . .\r\n";
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):将集纳保存到应用程序存款和储蓄

发表评论

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

网站地图xml地图