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

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

见到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 二零一一 引进了1个简化的主意(即异步编制程序),该方法应用 .NET
Framework 4.伍 和 Windows 运维时中的异步协理。 编写翻译器可实施开发人士曾开始展览的高难度工作,且应用程序保留了2个近似于同台代码的逻辑结构。 因而,你只需做一小部分工作就能够取得异步编制程序的保有好处。

Visual
Studio 二〇一二 引进了1个简化的章程(即异步编制程序),该办法运用 .NET
Framework 4.伍 和 Windows 运转时中的异步协助。 编写翻译器可实行开发职员曾展开的高难度工作,且应用程序保留了3个像样于联合代码的逻辑结构。 由此,你只需做一小部分工作就足以获取异步编制程序的全数好处。

一、异步编制程序的简介

  通过行使异步编制程序,你可以制止质量瓶颈并抓好应用程序的完好响应能力。

  Visual
Studio 二零一一 引进了一个简化的主意,异步编制程序,在 .NET Framework 四.伍 和
Windows 运转时行使异步支持。编写翻译器可实施开发职员曾举行的高难度工作,且应用程序保留了1个好像于1块代码的逻辑结构。由此,您仅供给展开一小部分行事就足以获得异步编制程序的有着优点。

 

使用 async 修饰符可将艺术、lambda 表明式或匿名方式钦赐为异步。

本主旨概述了几时以及怎么样利用异步编制程序,并蕴涵针对包罗详细新闻和演示的支撑大旨的链接。

本宗旨概述了哪天以及哪些利用异步编制程序,并包罗针对包涵详细音讯和示范的辅助核心的链接。

②、异步进步响应能力

  异步对或然引起短路的移动(例如应用程序访问
Web 时)至关心注重要。对
Web 财富的拜访有时相当的慢或会推迟。借使此类活动在1道进程中受阻,则整个应用程序必须等待。 在异步进度中,应用程序可继续执行不依赖Web 能源的其它干活,直至潜在阻塞的天职到位。

  下图突显了异步编制程序进步响应能力的优良应用场景。包蕴从
.NET Framework 四.5 和 Windows
运转时中列出的一部分包括协助异步编制程序的办法的类。

  由于负有与用户界面相关的移动壹般共享一个线程,由此,异步对走访
UI 线程的应用程序来说尤其关键。 假使在2个合伙应用程序中有此外的线程被卡住了,那么具有线程都将被卡住,再严重一点,你的应用程序将会甘休响应。

  使用异步方法时,应用程序将继续响应
UI。例如,你能够调整窗口的大大小小或最小化窗口;假使你不指望等待应用程序结束,则足以将其关闭。

 

async 对章程做了何等处理

从使用async修饰符修饰的法门的IL代码能够汲取3个结论:

  • 在Debug下,针对async方法,生成的是一个class状态机
  • 在Release下,针对async方法,生成的是三个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

异步提升响应能力

异步进步响应能力

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

  C#
中的 async 和 await 关键字都是异步编制程序的为主。通过使用那五个重大字,你能够应用
.NET framework 或 Windows
运转时中的能源轻松创设异步方法(大概与成立同步方法1致自在)。

  下边包车型地铁演示演示了一种接纳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 修饰符。

  (2)依照预约,异步方法的称呼以“Async”后缀为末段。

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

    壹 倘使你的不二法门有操作数为
TResult 类型的回到语句,则为 Task<TResult>。

    贰 借使您的点子未有回到语句或持有未有操作数的回来语句,则为 Task。

    三 若是您编写的是异步事件处理程序,则为
void。

  (4)方法一般包蕴至少八个await
表明式,该表明式标记1个点,在该点上,直到等待的异步操作达成章程才能持续。 同时,将艺术挂起,并且控制权将回到到形式的调用方。

  在异步方法中,可选拔提供的主要性字和类型来提示须求做到的操作,且编写翻译器会完毕别的操作。 

 

异步方法的定义和注意事项

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

注意事项:

  • 如果 async 关键字修改的艺术不含有 await
    表明式或讲话,则该办法将协同执行。 编写翻译器警告将通知你不含有 await
    语句的其余异步方法,因为该意况或然代表存在漏洞非常多。
    请参阅编写翻译器警告(等级
    壹)CS4014。
  • async 关键字是上下文关键字,原因在于只有当它修饰方法、lambda
    表明式或匿名方式时,它才是珍视字。
    在全体其他上下文中,都会将其表达为标识符。
  • 不要用 void 作为 async 方法的回到类型! async 方法能够重临
    void ,不过那仅限于编写事件处理程序。八个一般性的 async
    方法假设没有再次来到值,要赶回Task ,而不是 void
  • 毫无疑问要防止使用Task.WaitTask<T>.Result
    方法,因为它们会促成死锁。若是利用了 async ,最棒就径直利用它。
  • 异步方法的参数无法使用outrefoutref
    返回的数目应借用Task<TResult> 重临,能够选拔元组或自定义数据结构。

 

 

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

  异步编制程序中最需弄清的是控制流,即如何从2个情势移动到另三个方法,
请用1颗感恩的心来察看下图。

  步骤解析:

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

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

  三若是 GetStringAsync 中发生了某种情况,该意况挂起了它的长河。或许必须等待网址下载或一些任何阻塞的运动。为幸免阻塞财富,GetStringAsync 会将控制权出让给其调用方 AccessTheWebAsync。GetStringAsync 再次来到 Task,在这之中 TResult
为字符串,并且 AccessTheWebAsync 将职务分配给 getStringTask 变量。该职责表示调用 GetStringAsync 的正在进行的进程,在那之中承诺当工作形成时发出实际字符串值。

  肆 由于尚未等待 getStringTask,由此,AccessTheWebAsync 可以继续执行不借助于于 GetStringAsync 得出最后结果的其余任务。该职责由对一起方法 DoIndependentWork 的调用表示。

  伍 DoIndependentWork 是马到成功其行事并回到其调用方的1起方法。

  六 AccessTheWebAsync 已做到工作,可以不受 getStringTask 的结果影响。 接下来,AccessTheWebAsync 须要总计并赶回该下载字符串的尺寸,但该措施仅在具备字符串时才能总计该值。由此,AccessTheWebAsync 使用贰个 await
运算符来挂起其速度,并把控制权交给调用 AccessTheWebAsync 的点子。AccessTheWebAsync 将 Task<int> 再次来到至调用方。 该职责表示对产生下载字符串长度的平头结果的1个承诺。

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

  在调用方内部(尽管那是二个事件处理程序),处理情势将继续。在等候结果前,调用方能够展开不借助于 AccessTheWebAsync 结果的别样干活,不然就需等候片刻。事件处理程序等待 AccessTheWebAsync,而 AccessTheWebAsync 等待 GetStringAsync。

  七 GetStringAsync 完结并生成贰个字符串结果。 字符串结果不是通过你预期的点子调用 GetStringAsync 所再次来到的。(请记住,此措施已在步骤 三中回到四个任务。)相反,字符串结果存款和储蓄在象征完结章程 getStringTask 的义务中。 await
运算符从 getStringTask 中找寻结果。赋值语句将寻找到的结果赋给 urlContents。

  8 当 AccessTheWebAsync 具有字符串结果时,该办法能够测算字符串长度。然后,AccessTheWebAsync 工作也将形成,并且等待事件处理程序可继承选取。 

 

  你能够品尝思量一下联合署名行为和异步行为之间的距离。当其工作形成时(第伍 步)会回到2个联机方法,但当其工作挂起时(第 三 步和第 陆步),异步方法会重临2个职责值。在异步方法最后成功其工作时,职分会标记为已形成,而结果(假设有)将积存在职分中。

 

异步方法的特点

  • 措施签名包罗 async 修饰符。
  • 依照预定,异步方法的称谓以“Async”后缀结尾。
  • 回到类型为下列项目之一:
    • 假设你的不二等秘书诀有操作数为 TResult 类型的归来语句,则为
      Task<TResult>
    • 尽管您的点子未有回来语句或持有未有操作数的回来语句,则为
      Task
    • void:借使要编写制定异步事件处理程序。
    • 包含 GetAwaiter 方法的别样任何项目(自 C# 7.0 起)。
  • 方法1般包罗至少3个 await
    表明式,该表达式标记一个点,在该点上,直到等待的异步操作完毕措施展才能能继承。
    同时,将艺术挂起,并且决定重回到艺术的调用方。

有关async和await具体的施行流程,方法曾几何时挂起和刑满释放解除劳教,请参考异步程序中的控制流
(C#)

 

 

五、线程

  异步方法意在成为非阻塞操作。异步方法中的
await 表明式在守候的天职正在运作时不会堵塞当前线程。相反,表明式在后续时登记方式的其他部分并将控制权重临到异步方法的调用方。

  async
和 await 关键字不会造成创设其余线程。因为异步方法不会在其自个儿线程上运转,由此它不要求十二线程。唯有当方法处于活动状态时,该办法将在当前联手上下文中运维并接纳线程上的年月。能够选拔 Task.Run 将占据多量CPU
的工作移到后台线程,不过后台线程不会接济正在守候结果的经过变为可用状态。

  对于异步编制程序而言,该基于异步的艺术优于大约各类用例中的现有措施。具体而言,此形式比 BackgroundWorker 更适用于
IO 绑定的操作,因为此代码更简单且无需提防当先争用规范。结合 Task.Run 使用时,异步编制程序比 BackgroundWorker 更适用于
CPU 绑定的操作,因为异步编制程序将运营代码的协调细节与 Task.Run 传输至线程池的劳作分别开来。

 

异步重回类型

上边提到 void 作为再次来到结果,适用于事件处理程序。
金沙注册送58 ,举例:

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 作为再次来到结果存在2个害处:不能捕获非凡。

再次来到 void
的异步方法的调用方无法捕获从该格局引发的越发,且此类未经处理的越发也许会招致应用程序故障。
假诺回到 TaskTask<TResult>
的异步方法中出现非凡,此1贰分将积存于重回的天职业中学,并在伺机该职分时再也挑动。

通用的异步再次来到类型:

从 C# 柒.0 初始,异步方法可重回任何拥有可访问的 GetAwaiter
方法的品种。

ValueTask<TResult>

Task 和 Task<TResult> 是引用类型,由此,品质关键路径中的内部存储器分配会对品质产生负面影响,特别当分配出现在严密循环中时。
帮忙通用重回类型意味着可回到轻量值类型(而不是引用类型),从而制止额外的内部存款和储蓄器分配。

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

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

异步对大概滋生短路的活动(例如应用程序访问
Web 时)至关心珍视要。 对
Web 财富的造访有时相当慢或会推迟。 假如此类活动在一齐进程中受阻,则整个应用程序必须等待。 在异步进程中,应用程序可继续执行不信赖Web 能源的其余干活,直至潜在阻止职务成功。

异步对或然滋生短路的移位(例如应用程序访问
Web 时)至关心器重要。 对
Web 财富的访问有时一点也不快或会延迟。 假设此类活动在联合进度中受阻,则整个应用程序必须等待。 在异步进度中,应用程序可继续执行不重视Web 能源的别的干活,直至潜在阻止职责成功。

六、async 和 await

  要是因此采纳 async 修饰符钦点某种情势为异步方法,则会晤世下边二种处境。

  • 标记的异步方法能够行使 await 来钦命悬挂点。await
    运算符文告编译器异步方法唯有直到等待的异步进度一气浑成才能三番五次透过该点。同时,控制权将再次回到至异步方法的调用方。

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

  • 标记的异步方法本人可以经过调用它的方法等待。

  异步方法一般包括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 4.伍 和 Windows 运转时中列出的 API
包罗支持异步编制程序的艺术。

下表呈现了异步编制程序进步响应能力的出色应用场景。 从
.NET Framework 四.5 和 Windows 运转时中列出的 API
包涵扶助异步编制程序的点子。

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

  在
.NET 中,异步方法1般重回 Task 或 Task<TResult>。在异步方法中,await
运算符应用于通过调用另1个异步方法再次回到的任务。

  借使措施包括 内定项目 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 编程

同步和异步操作

   

捌、命名的预订

  依照约定,将“Async”追加到具有 async 修饰符的办法名称。

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

 

是因为全部与用户界面相关的移位1般共享二个线程,由此,异步对走访
UI 线程的应用程序来说尤其主要。 借使其余进度在联合应用程序中受阻,则装有进程都将受阻。 你的应用程序截至响应,由此,你大概在其等待进度中认为它曾经破产。

出于拥有与用户界面相关的移动一般共享2个线程,因而,异步对走访
UI 线程的应用程序来说尤其关键。 假若其它进度在同步应用程序中受阻,则持有进度都将受阻。 你的应用程序为止响应,因而,你或者在其等待历程中认为它已经失败。

传送门 

 


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

 

 

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

接纳异步方法时,应用程序将再而三响应
UI。 例如,你能够调整窗口的尺寸或最小化窗口;借使你不愿意等待应用程序甘休,则足以将其关闭。

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

当设计异步操作时,该基于异步的方法将机关传输的1样对象添加到可从中挑选的选项列表中。 开发职员只须要投入较少的工作量即可使您拿走古板异步编程的具备优点。

的异步编制程序,学习笔记。当设计异步操作时,该基于异步的不二法门将自动传输的相同对象添加到可从中挑选的选项列表中。 开发职员只需要投入较少的工作量即可使你收获守旧异步编制程序的全体优点。

异步方法更易于编写

异步方法更便于编写

 

 

 

 

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 定义的异步方法。

上面包车型地铁以身作则演示了一种异步方法。 你应对代码中的大约拥有内容都很是纯熟。 注释调出你添加的用来创建异步的功力。

下边包车型地铁以身作则演示了一种异步方法。 你应对代码中的大约全部剧情都相当熟谙。 注释调出你添加的用来创立异步的成效。

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

    至于详细新闻,请参见本核心前面包车型的士“重临类型和参数”。

  • 艺术1般包括至少一个await
    表明式,该表明式标记贰个点,在该点上,直到等待的异步操作达成章程才能继续。 同时,将艺术挂起,并且控件重临到点子的调用方。 本宗旨的下1节将分解悬挂点爆发的事态。

  • 方法签名包括3个 Async 或 async 修饰符。

  • 服从预订,异步方法的称谓以“Async”后缀为结尾。

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

    • 假若你的法门有操作数为
      TResult
      类型的回来语句,则为 Task<TResult>。

    • 只要你的法子未有回来语句或持有未有操作数的回到语句,则为 Task。

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

    有关详细消息,请参见本主旨前面包车型大巴“重返类型和参数”。

  • 主意一般包蕴至少一个await
    表明式,该表达式标记贰个点,在该点上,直到等待的异步操作实现措施才能继承。 同时,将艺术挂起,并且控件再次回到到方法的调用方。 本主旨的下壹节将解释悬挂点产生的意况。

在异步方法中,可应用提供的主要性字和花色来提醒须求做到的操作,且编写翻译器会成功其余操作,当中囊括不断跟踪控件以挂起方法重回等待点时发生的情景。 壹些正规流程(例如,循环和非凡处理)在观念异步代码中拍卖起来大概很不便。 在异步方法中,成分的编辑撰写频率与一同化解方案相同且此难点获得消除。

在异步方法中,可利用提供的关键字和连串来提醒须要达成的操作,且编写翻译器会形成其余操作,在这之中囊括不断跟踪控件以挂起方法重回等待点时发出的动静。 1些常规流程(例如,循环和万分处理)在价值观异步代码中拍卖起来只怕很难堪。 在异步方法中,成分的编排频率与一同解决方案相同且此题材获得化解。

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

至于
.NET Framework 早期版本中的异步的越来越多新闻,请参见 TPL and Traditional
.NET Framework Asynchronous
Programming。

异步方法中发生的事情

异步方法中生出的政工

 

 

 

 

异步编程中最需弄清的是控制流是哪些从事艺术工作术移动到格局的。 下图可辅导你完结该进程。

异步编制程序中最需弄清的是控制流是何许从章程移动到方法的。 下图可带领您完了该进程。

金沙注册送58 1

金沙注册送58 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 使用3个 await
    运算符来挂起其速度,并把控制权交给调用 AccessTheWebAsync 的方法。AccessTheWebAsync 将 Task(Of
    Integer)
     或 Task<int> 再次回到至调用方。 该职分表示对发出下载字符串长度的平头结果的三个答应。

    注意

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

    在调用方内部(此示例中的事件处理程序),处理格局将三番五次。 在等候结果前,调用方能够展开不借助于 AccessTheWebAsync 结果的其他干活,不然就需等待片刻。 事件处理程序等待 AccessTheWebAsync,而 AccessTheWebAsync 等待 GetStringAsync

  7. GetStringAsync 完毕并生成3个字符串结果。 字符串结果不是通过按你预期的章程调用 GetStringAsync 所重返的。 (记住,该办法已回到步骤
    叁 中的八个职分)。 相反,字符串结果存款和储蓄在象征落成 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 中的1个任务)。 相反,字符串结果存款和储蓄在象征实现 getStringTask 方法的职分中。 await
    运算符从 getStringTask 中搜索结果。赋值语句将追寻到的结果赋给 urlContents。

  8. 当 AccessTheWebAsync 具有字符串结果时,该方法能够测算字符串长度。 然后,AccessTheWebAsync 工作也将成功,并且等待事件处理程序可继承选择。 在此宗旨结尾处的完整示例中,可确认事件处理程序检索并打字与印刷长度结果的值。

尽管你目生异步编制程序,请花
壹 分钟时间思虑共同行为和异步行为之间的差异。 当其工作成功时(第四 步)会回来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 四.5 包涵使用 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 捌.x 应用集团应用中可与 async 和 await
一起行使的诀要。 有关越多消息和示范方法,请参见迅猛入门:将
await
运算符用于异步编制程序、异步编制程序(Windows
应用商店应用)和WhenAny:.NET
Framework 和 Windows 运营时之间的桥接(C# 和 Visual
Basic)。

线程

线程

 

 

 

 

异步方法意在成为非阻止操作。 异步方法中的
await 表明式在伺机的任务正在运维时不会阻拦当前线程。 相反,表明式在此起彼伏时登记形式的别的部分并将控件重返到异步方法的调用方。

异步方法目的在于成为非阻止操作。 异步方法中的
await 表明式在守候的任务正在运维时不会阻拦当前线程。 相反,表达式在持续时登记情势的别的部分并将控件重返到异步方法的调用方。

async
和 await 关键字不会造成创立别的线程。 因为异步方法不会在其自己线程上运维,因而它不须求多线程。 唯有当方法处于活动状态时,该办法将在此时此刻1道上下文中运维并动用线程上的时光。 能够选拔 Task.Run 将占用大量CPU
的做事移到后台线程,不过后台线程不会赞助正在等候结果的长河变为可用状态。

async
和 await 关键字不会促成创造别的线程。 因为异步方法不会在其自个儿线程上运转,因而它不需求102线程。 只有当方法处于活动状态时,该方法将在时下壹并上下文中运作并行使线程上的岁月。 能够动用 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 修饰符的艺术的称谓。

假定某一约定中的事件、基类或接口协定建议其他名目,则足以忽略此预约。 例如,你不应重命名常用事件处理程序,例如 Button一_Click。

1旦某壹约定中的事件、基类或接口协定提出其余名目,则足以忽略此预约。 例如,你不应重命名常用事件处理程序,例如 Button一_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 频道上的异步视频

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

 

1体化的以身作则

完全的演示

 

 

 

 

上面包车型客车代码是缘于于本宗旨探究的
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地图