威尼斯人线上娱乐

【威尼斯人线上娱乐】出现编制程序经典实例,的异步编制程序

9 4月 , 2019  

C# 5.0 推出async和await,最早是.NET Framework 4.5引进,能够在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 2013 引进了1个简化的法子(即异步编制程序),该方法应用 .NET
Framework 四.5 和 Windows 运转时中的异步扶助。 编写翻译器可实行开发职员曾开始展览的高难度工作,且应用程序保留了一个类似于同台代码的逻辑结构。 因而,你只需做一小部分工作就能够获得异步编制程序的保有好处。

Visual
Studio 二〇一三 引进了二个简化的办法(即异步编制程序),该方法应用 .NET
Framework 四.伍 和 Windows 运转时中的异步帮助。 编写翻译器可进行开发人士曾开始展览的高难度工作,且应用程序保留了1个近乎于同台代码的逻辑结构。 由此,你只需做一小部分工作就能够获取异步编制程序的保有好处。

一、异步编制程序的简介

  通过选用异步编制程序,你可以幸免质量瓶颈并进步应用程序的全部响应能力。

  Visual
Studio 2011 引进了2个简化的不二秘诀,异步编制程序,在 .NET Framework 四.5 和
Windows 运维时使用异步协理。编写翻译器可实施开发职员曾开始展览的高难度工作,且应用程序保留了多少个看似于同台代码的逻辑结构。因而,您仅须要举办一小部分办事就能够拿走异步编制程序的持有优点。

 

使用 async 修饰符可将艺术、lambda 表达式或匿名格局钦命为异步。

本宗旨概述了哪天以及怎样运用异步编制程序,并包蕴针对包罗详细音信和示范的帮助核心的链接。

本宗旨概述了曾几何时以及怎么着运用异步编程,并包涵针对包蕴详细新闻和演示的支撑宗旨的链接。

二、异步升高响应能力

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

  下图彰显了异步编制程序进步响应能力的超级应用场景。包括从
.NET Framework 四.伍 和 Windows
运维时中列出的部分分包帮助异步编制程序的主意的类。

  由于具备与用户界面相关的移位一般共享1个线程,由此,异步对走访
UI 线程的应用程序来说越发首要。 倘诺在3个联合署名应用程序中有别的的线程被打断了,那么富有线程都将被封堵,再严重一点,你的应用程序将会告壹段落响应。

  使用异步方法时,应用程序将继承响应
UI。例如,你能够调整窗口的尺寸或最小化窗口;假使你不希望等待应用程序截至,则足以将其关闭。

 

async 对艺术做了什么样处理

从使用async修饰符修饰的诀窍的IL代码能够汲取一个定论:

  • 在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

异步升高响应能力

异步提升响应能力

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 修饰符。

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

  (三)重返类型为下列项目之一:

    壹 倘若你的艺术有操作数为
TResult 类型的归来语句,则为 Task<TResult>。

    2 借使你的法子未有回到语句或享有未有操作数的回来语句,则为 Task。

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

  (四)方法壹般包涵至少三个await
表明式,该表达式标记1个点,在该点上,直到等待的异步操作达成措施展才能能持续。 同时,将艺术挂起,并且控制权将回到到格局的调用方。

  在异步方法中,可使用提供的根本字和项目来提示必要达成的操作,且编译器会实现别的操作。 

 

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

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

注意事项:

  • 如果 async 关键字修改的章程不带有 await
    表明式或言辞,则该方法将壹块执行。 编写翻译器警告将文告你不带有 await
    语句的此外异步方法,因为该意况或许意味着存在指鹿为马。
    请参阅编写翻译器警告(等级
    一)CS401四。
  • async 关键字是上下文关键字,原因在于只有当它修饰方法、lambda
    表明式或匿名方式时,它才是人命关天字。
    在装有别的上下文中,都会将其表达为标识符。
  • 不要用 void 作为 async 方法的回来类型! async 方法可以回去
    void ,但是那仅限于编写事件处理程序。三个平淡无奇的 async
    方法若是未有再次回到值,要回来Task ,而不是 void
  • 自然要制止选取Task.WaitTask<T>.Result
    方法,因为它们会造成死锁。借使运用了 async ,最棒就直接使用它。
  • 异步方法的参数不可能选择outrefoutref
    重返的数目应借用Task<TResult> 重回,能够使用元组或自定义数据结构。

 

 

四、异步方法的控制流(宗旨)

  异步编制程序中最需弄清的是控制流,即什么从1个办法移动到另几个办法,
请用壹颗感恩的心来侦查下图。

  步骤解析:

  一 事件处理程序调用并听候 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> 重回至调用方。 该职务表示对产生下载字符串长度的平头结果的2个承诺。

  【备注】假设 GetStringAsync(即 getStringTask)在 AccessTheWebAsync 等待前形成,则控制权会保留在 AccessTheWebAsync 中。 假使异步调用进程(getStringTask) 已做到,并且 AccessTheWebSync
不必等待最终结果,则挂起接下来回来到 AccessTheWebAsync,但那会招致资金的荒废。

  在调用方内部(如果那是3个事件处理程序),处理情势将继续。在守候结果前,调用方能够进行不信赖于 AccessTheWebAsync 结果的别的干活,不然就需拭目以俟片刻。事件处理程序等待 AccessTheWebAsync,而 AccessTheWebAsync 等待 GetStringAsync。

  7 GetStringAsync 达成并生成多少个字符串结果。 字符串结果不是经过你预期的章程调用 GetStringAsync 所重回的。(请牢记,此情势已在步骤 叁中回到贰个任务。)相反,字符串结果存款和储蓄在象征完结措施 getStringTask 的天职业中学。 await
运算符从 getStringTask 中寻找结果。赋值语句将追寻到的结果赋给 urlContents。

  捌 当 AccessTheWebAsync 具有字符串结果时,该方法能够测算字符串长度。然后,AccessTheWebAsync 工作也将不辱职分,并且等待事件处理程序可接二连三接纳。 

 

  你能够品尝思索一下一块行为和异步行为之间的歧异。当其工作实现时(第6 步)会回去二个手拉手方法,但当其行事挂起时(第 三 步和第 陆步),异步方法会再次回到一个职分值。在异步方法最后形成其行事时,任务会标记为已形成,而结果(假如有)将积存在职务中。

 

异步方法的特点

  • 措施签名包罗 async 修饰符。
  • 依照约定,异步方法的名称以“Async”后缀结尾。
  • 重返类型为下列项目之一:
    • 如果您的格局有操作数为 TResult 类型的回来语句,则为
      Task<TResult>
    • 万壹您的主意未有再次来到语句或持有未有操作数的回到语句,则为
      Task
    • void:即便要编制异步事件处理程序。
    • 包含 GetAwaiter 方法的别样任何项目(自 C# 7.0 起)。
  • 办法1般包括至少多个 await
    表明式,该表明式标记三个点,在该点上,直到等待的异步操作完毕措施展才能能持续。
    同时,将艺术挂起,并且决定重回到点子的调用方。

有关async和await具体的执行流程,方法几时挂起和释放,请参考异步程序中的控制流
(C#)

 

 

五、线程

  异步方法目的在于成为非阻塞操作。异步方法中的
await 表明式在等候的天职正在运行时不会堵塞当前线程。相反,表明式在持续时登记情势的别的部分并将控制权重返到异步方法的调用方。

  async
和 await 关键字不会导致创制别的线程。因为异步方法不会在其自个儿线程上运转,由此它不供给十2线程。只有当方法处于活动状态时,该方式将在现阶段一起上下文中运转并使用线程上的大运。能够应用 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 财富的拜会有时非常慢或会延迟。 若是此类活动在一块进度中受阻,则整个应用程序必须等待。 在异步进程中,应用程序可继续执行不依赖Web 能源的此外工作,直至潜在阻止职分到位。

异步对大概滋生短路的活动(例如应用程序访问
Web 时)至关心珍视要。 对
Web 能源的造访有时一点也不快或会延迟。 假诺此类活动在共同进度中受阻,则全体应用程序必须等待。 在异步进度中,应用程序可继续执行不信赖Web 财富的此外工作,直至潜在阻止职分到位。

六、async 和 await

  假诺因此利用 async 修饰符钦定某种方式为异步方法,则会现出上边三种情状。

  • 标志的异步方法能够使用 await 来内定悬挂点。await
    运算符公告编写翻译器异步方法只有直到等待的异步进程完结才能再而三通过该点。同时,控制权将回到至异步方法的调用方。

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

  • 标志的异步方法本身可以透过调用它的措施等待。

  异步方法1般包蕴await 运算符的1个或多少个相称项,但缺少 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 四.伍 和 Windows 运维时中列出的 API
包蕴援助异步编制程序的法子。

下表突显了异步编制程序升高响应能力的出色应用场景。 从
.NET Framework 四.5 和 Windows 运营时中列出的 API
包括补助异步编制程序的艺术。

7、重返类型和参数音信

  在
.NET 中,异步方法1般再次来到 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 编程

同步和异步操作

   

八、命名的预订

  依照预定,将“Async”追加到全体 async 修饰符的章程名称。

  假如某一约定中的事件、基类或接口协定提出其余名目,则能够忽略此预约。例如,你不应重命名常用事件处理程序,例如 btnOpen_Click。

 

出于拥有与用户界面相关的位移一般共享三个线程,因而,异步对走访
UI 线程的应用程序来说尤为关键。 要是别的进程在一块儿应用程序中受阻,则有着进度都将受阻。 你的应用程序结束响应,由此,你大概在其等待历程中觉得它已经失利。

鉴于有着与用户界面相关的移位1般共享3个线程,因而,异步对走访
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 定义的异步方法。

上面包车型大巴以身作则演示了1种异步方法。 你应对代码中的差不多拥有剧情都不行熟习。 注释调出你添加的用来成立异步的功能。

下边包车型客车示范演示了1种异步方法。 你应对代码中的差不多全部情节都11分熟习。 注释调出你添加的用来创建异步的功力。

您可以在本主旨的结尾找到完整的演示文件,并且能够从 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();

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

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

  • 措施签名包涵1个 Async 或 async 修饰符。

  • 依照约定,异步方法的名称以“Async”后缀为尾声。

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

    • 如果您的章程有操作数为
      TResult
      类型的归来语句,则为 Task<TResult>。

    • 借使您的不二等秘书诀未有回来语句或持有未有操作数的回来语句,则为 Task。

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

    有关详细音信,请参见本宗旨前面包车型客车“重临类型和参数”。

  • 措施一般包罗至少3个await
    表达式,该表明式标记一个点,在该点上,直到等待的异步操作完毕措施展才能能持续。 同时,将艺术挂起,并且控件重临到点子的调用方。 本核心的下1节将表明悬挂点发生的状态。

  • 艺术签名包蕴二个 Async 或 async 修饰符。

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

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

    • 只要你的主意有操作数为
      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。

异步方法中发生的工作

异步方法中生出的业务

 

 

 

 

异步编制程序中最需弄清的是控制流是怎么从章程移动到情势的。 下图可引导你落成该进程。

异步编制程序中最需弄清的是控制流是怎么样从点子移动到方法的。 下图可指点您完了该进程。

威尼斯人线上娱乐 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 完毕并生成3个字符串结果。 字符串结果不是经过按您预期的法子调用 GetStringAsync 所重回的。 (记住,该措施已重临步骤
    三 中的一个义务)。 相反,字符串结果存储在象征实现 getStringTask 方法的天职业中学。 await
    运算符从 getStringTask 中搜寻结果。赋值语句将寻找到的结果赋给 urlContents。

  8. 当 AccessTheWebAsync 具有字符串结果时,该格局能够总计字符串长度。 然后,AccessTheWebAsync 工作也将成功,并且等待事件处理程序可接二连三行使。 在此主旨结尾处的1体化示例中,可确认事件处理程序检索并打印长度结果的值。

  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 完结并生成2个字符串结果。 字符串结果不是透过按你预期的章程调用 GetStringAsync 所再次回到的。 (记住,该方式已回到步骤
    三 中的3个任务)。 相反,字符串结果存款和储蓄在象征达成 getStringTask 方法的天职业中学。 await
    运算符从 getStringTask 中追寻结果。赋值语句将追寻到的结果赋给 urlContents。

  8. 当 AccessTheWebAsync 具有字符串结果时,该办法可以测算字符串长度。 然后,AccessTheWebAsync 工作也将不辱义务,并且等待事件处理程序可一连选择。 在此宗旨结尾处的全体示例中,可确认事件处理程序检索并打字与印刷长度结果的值。

假定你不熟识异步编制程序,请花
一 分钟时间思考共同行为和异步行为之间的出入。 当其行事到位时(第伍 步)会回去贰个同步方法,但当其工作挂起时(第 3 步和第 6步),异步方法会再次来到二个职分值。 在异步方法最后大功告成其工作时,职务会标记为已到位,而结果(固然有)将积存在职分中。

假如您不掌握异步编制程序,请花
1 分钟时间思考共同行为和异步行为之间的反差。 当其行事做到时(第四 步)会再次回到二个壹并方法,但当其行事挂起时(第 三 步和第 陆步),异步方法会重回一个职务值。 在异步方法最终水到渠成其行事时,职分会标记为已成功,而结果(假如有)将积存在任务中。

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

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

API 异步方法

API 异步方法

 

 

 

 

您只怕想知道从何地能够找到 GetStringAsync 等援助异步编制程序的主意。.NET
Framework 四.伍 包含使用 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
1起利用的艺术。 有关更加多新闻和演示方法,请参见火速入门:将
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 关键字不会导致创设别的线程。 因为异步方法不会在其自我线程上运维,因而它不必要拾2线程。 唯有当方法处于活动状态时,该格局将在现阶段联合署名上下文中运作并选用线程上的时间。 能够使用 Task.Run 将占据多量CPU
的劳作移到后台线程,可是后台线程不会拉拉扯扯正在守候结果的经过变为可用状态。

async
和 await 关键字不会造成成立其他线程。 因为异步方法不会在其自作者线程上运营,因而它不须求八线程。 只有当方法处于活动状态时,该办法将在此时此刻壹道上下文中运营并动用线程上的光阴。 能够接纳 Task.Run 将占用大批量CPU
的做事移到后台线程,然则后台线程不会赞助正在等候结果的经过变为可用状态。

对于异步编制程序而言,该基于异步的点子优于大概各类用例中的现有措施。 具体而言,此措施比 BackgroundWorker 更适用于
IO 绑定的操作,因为此代码更简便易行且无需防备争用标准化。 结合 Task.Run 使用时,异步编制程序比 BackgroundWorker 更适用于
CPU
绑定的操作,因为异步编制程序将运营代码的调和细节与 Task.Run 传输至线程池的行事分别开来。

对此异步编制程序而言,该基于异步的不2秘籍优于大致各样用例中的现有措施。 具体而言,此格局比 BackgroundWorker 更适用于
IO 绑定的操作,因为此代码更简便易行且无需提防争用口径。 结合 Task.Run 使用时,异步编制程序比 BackgroundWorker 更适用于
CPU
绑定的操作,因为异步编制程序将运维代码的和谐细节与 Task.Run 传输至线程池的做事分别开来。

异步和等候

异步和等待

 

 

 

 

比方通过运用 Async 或 async 修饰符钦命某种格局为异步方法,则足以启用以下多个功用。

只要通过利用 Async 或 async 修饰符钦定某种情势为异步方法,则足以启用以下四个功用。

  • 标志的异步方法能够选用 Await 或 await 来钦赐悬挂点。 await
    运算符文告编写翻译器异步方法唯有直到等待的异步进程一挥而就才能三番五次通过该点。同时,控件重回至异步方法的调用方。

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

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

  • 标志的异步方法能够使用 Await 或 await 来内定悬挂点。 await
    运算符文告编写翻译器异步方法只有直到等待的异步进程做到才能三番五次通过该点。同时,控件重回至异步方法的调用方。

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

  • 标志的异步方法自身能够经过调用它的点子等待。

异步方法一般包括await 运算符的3个或四个相配项,但贫乏 await
表达式不会造成编写翻译器错误。 假诺异步方法未使用
await
运算符标记悬挂点,则该办法将用作1道方法执行,不管异步修饰符如何。 编写翻译器将为此类措施公布3个警示。

异步方法一般包罗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
编制程序中,异步方法1般重返 Task 或 Task<TResult>。 在异步方法中,await
运算符应用于通过调用另3个异步方法重返的职分。


.NET Framework
编制程序中,异步方法壹般再次回到 Task 或 Task<TResult>。 在异步方法中,await
运算符应用于通过调用另3个异步方法再次来到的职责。

假设格局包括内定 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();

各样重回的任务表示正在开始展览的做事。 任务可包裹有关异步进度情况的音讯,倘若未中标,则末了会卷入来自进度的末段结出或进度引发的10分。

各样再次来到的职责表示正在开始展览的干活。 义务可包裹有关异步进度情形的音讯,如若未得逞,则最后会卷入来自进度的结尾结果或进度引发的要命。

异步方法还足以是 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 频道上的异步视频

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

 

完全的言传身教

总体的示范

 

 

 

 

上边的代码是缘于于本主旨探究的
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地图