的异步编制程序,并发编制程序经典实例

By admin in 4858.com on 2019年3月25日

C# 5.0 推出async和await,最早是.NET Framework 4.5引入,能够在Visual
Studio
2011用到。在此之前的异步编制程序完毕难度较高,async使异步编制程序的完结变得简便。

见到Microsoft官方一篇关于异步编制程序的稿子,感觉挺好,不敢独享,分享给大家。

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

[.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 引入了叁个简化的方法(即异步编制程序),该方法应用 .NET
Framework 4.5 和 Windows 运转时中的异步支持。 编写翻译器可实行开发职员曾展开的高难度工作,且应用程序保留了1个看似于联合代码的逻辑结构。 因此,你只需做一小部分工作就足以获得异步编制程序的富有好处。

Visual
Studio 二零一二 引入了二个简化的点子(即异步编制程序),该办法应用 .NET
Framework 4.5 和 Windows 运营时中的异步援助。 编写翻译器可实施开发人士曾进行的高难度工作,且应用程序保留了三个好像于同台代码的逻辑结构。 由此,你只需做一小部分工作就能够拿走异步编制程序的持有好处。

① 、异步编制程序的简介

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

  Visual
Studio 二〇一一 引入了八个简化的办法,异步编制程序,在 .NET Framework 4.5 和
Windows 运维时行使异步协理。编写翻译器可进行开发人士曾举行的高难度工作,且应用程序保留了三个看似于同台代码的逻辑结构。因而,您仅供给实行一小部分办事就可以获取异步编程的富有优点。

 

使用 async 修饰符可将艺术、lambda 表明式或匿超级模特式钦点为异步。

本核心概述了几时以及哪些行使异步编制程序,并包括针对包涵详细消息和示范的支持主旨的链接。

本宗旨概述了曾几何时以及哪些选择异步编制程序,并蕴涵针对包括详细音讯和演示的支撑大旨的链接。

② 、异步提升响应能力

  异步对也许滋生短路的位移(例如应用程序访问
Web 时)至关心体贴要。对
Web 财富的走访有时相当的慢或会延迟。如若此类活动在联合过程中受阻,则全体应用程序必须等待。 在异步进度中,应用程序可继续执行不注重Web 财富的此外工作,直至潜在阻塞的任务到位。

  下图呈现了异步编制程序提升响应能力的天下第贰应用场景。包括从
.NET Framework 4.5 和 Windows
运转时中列出的局地带有支持异步编制程序的点子的类。

  由于全数与用户界面相关的位移一般共享1个线程,由此,异步对走访
UI 线程的应用程序来说特别首要。 若是在2个联手应用程序中有其余的线程被堵塞了,那么富有线程都将被打断,再严重一点,你的应用程序将会停下响应。

  使用异步方法时,应用程序将持续响应
UI。例如,你能够调整窗口的大小或最小化窗口;就算你不期望等待应用程序甘休,则能够将其关闭。

 

async 对艺术做了什么样处理

从使用async修饰符修饰的章程的IL代码可以汲取一个定论:

  • 在Debug下,针对async方法,生成的是1个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
运维时中的能源轻松成立异步方法(大致与创制同步方法一致自在)。

  下边包车型地铁演示演示了一种选拔async 和 await 定义的异步方法。

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

 

  假如 AccessTheWebAsync 在调用 GetStringAsync
时没有任何操作,你能够用如此的格局来简化代码。

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

  

  依照上述代码进行简要总结:

  (1)方法签名蕴含1个 async 修饰符。

  (2)依照预定,异步方法的称谓以“Async”后缀为结尾。

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

    ① 即使您的点子有操作数为
TResult 类型的归来语句,则为 Task<TResult>。

    ② 假诺您的艺术没有重返语句或持有没有操作数的回到语句,则为 Task。

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

  (4)方法一般包涵至少一个await
表达式,该表明式标记二个点,在该点上,直到等待的异步操作达成章程才能再三再四。 同时,将艺术挂起,并且控制权将再次来到到方法的调用方。

  在异步方法中,可应用提供的根本字和体系来提示必要实现的操作,且编写翻译器会形成其他操作。 

 

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

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

注意事项:

  • 如果 async 关键字修改的法子不分包 await
    表明式或讲话,则该办法将同台施行。 编写翻译器警告将公告你不分包 await
    语句的其它异步方法,因为这场地或者代表存在漏洞非常多。
    请参阅编写翻译器警告(等级
    1)CS4014。
  • async 关键字是上下文关键字,原因在于唯有当它修饰方法、lambda
    表明式或匿名方式时,它才是注重字。
    在全数其余上下文中,都会将其表明为标识符。
  • 不要用 void 作为 async 方法的回到类型! async 方法可以再次来到
    void ,不过那仅限于编写事件处理程序。三个见怪不怪的 async
    方法假使没有重返值,要赶回Task ,而不是 void
  • 毫无疑问要防止选取Task.WaitTask<T>.Result
    方法,因为它们会招致死锁。即使利用了 async ,最佳就径直利用它。
  • 异步方法的参数不能够动用outrefoutref
    再次来到的数量应借用Task<TResult> 重回,可以利用元组或自定义数据结构。

 

 

四 、异步方法的控制流(焦点)

  异步编制程序中最需弄清的是控制流,即什么从三个方式移动到另一个形式,
请用一颗感恩的心来观察下图。

  步骤解析:

  ① 事件处理程序调用并伺机 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> 重回至调用方。 该职分表示对发出下载字符串长度的平头结果的1个答应。

  【备注】如若 GetStringAsync(即 getStringTask)在 AccessTheWebAsync 等待前成功,则控制权会保留在 AccessTheWebAsync 中。 假若异步调用进度(getStringTask) 已做到,并且 AccessTheWebSync
不必等待最后结出,则挂起接下来回来到 AccessTheWebAsync,但这会导致资金的荒废。

  在调用方内部(纵然那是1个事件处理程序),处理方式将持续。在等待结果前,调用方能够进行不依靠于 AccessTheWebAsync 结果的此外干活,不然就需等候片刻。事件处理程序等待 AccessTheWebAsync,而 AccessTheWebAsync 等待 GetStringAsync。

  ⑦ GetStringAsync 实现并生成1个字符串结果。 字符串结果不是透过你预期的法门调用 GetStringAsync 所重返的。(请记住,此方法已在步骤 3
中回到三个任务。)相反,字符串结果存款和储蓄在表示达成措施 getStringTask 的职责中。 await
运算符从 getStringTask 中追寻结果。赋值语句将追寻到的结果赋给 urlContents。

  ⑧ 当 AccessTheWebAsync 具有字符串结果时,该方式能够总括字符串长度。然后,AccessTheWebAsync 工作也将成功,并且等待事件处理程序可继承运用。 

 

  你能够品尝思考一下一起行为和异步行为之间的差别。当其工作形成时(第陆 步)会回去二个联合方法,但当其行事挂起时(第 3 步和第 6
步),异步方法会再次回到2个职务值。在异步方法最后水到渠成其工作时,任务会标记为已做到,而结果(即使有)将积存在任务中。

 

异步方法的特点

  • 措施签名包含 async 修饰符。
  • 依据预定,异步方法的名称以“Async”后缀结尾。
  • 重返类型为下列项目之一:
    • 假如您的点子有操作数为 TResult 类型的回到语句,则为
      Task<TResult>
    • 要是你的艺术没有回到语句或有所没有操作数的归来语句,则为
      Task
    • void:要是要编写异步事件处理程序。
    • 包含 GetAwaiter 方法的其余任何项目(自 C# 7.0 起)。
  • 主意一般包蕴至少二个 await
    表明式,该表明式标记一个点,在该点上,直到等待的异步操作达成章程才能三番五次。
    同时,将艺术挂起,并且决定再次来到到方法的调用方。

关于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 作为重临结果存在2个弊端:不可能捕获至极。

归来 void
的异步方法的调用方不可能捕获从该办法引发的相当,且此类未经处理的很是或许会造成应用程序故障。
借使回到 TaskTask<TResult>
的异步方法中现身十分,此万分将积存于重回的职务中,并在等待该任务时再次挑动。

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

从 C# 7.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状态都会因为任务10分导致转换为该情状。二者的区分如下:

借使标记的 IsCancellationRequested 属性重返false,大概尤其的标志与职务的记号不协作,则会将
OperationCanceledException 根据经常的不得了来处理,从而导致职务转换为
Faulted 状态。 此外还要注意,其余尤其的留存将也会招致任务转换为
Faulted 状态。 您能够在 Status 属性中获得已形成职责的情事。

参照小说:

  • async(C#
    参考)
  • 运用 Async 和 Await 的异步编制程序(C#)
  • 基于职责的异步模式(TAP)
  • 异步重临类型
    (C#)
  • 异步程序中的控制流
    (C#)
  • 职分撤除
  • 异步编制程序

下表显示了异步编制程序进步响应能力的独立应用场景。 从
.NET Framework 4.5 和 Windows 运营时中列出的 API
包罗支持异步编制程序的措施。

下表彰显了异步编程进步响应能力的典型应用场景。 从
.NET Framework 4.5 和 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 再次回到类型的异步方法,并且2个void 再次回到值的调用方不能够捕获该格局引发的别样越发。

  异步方法不可能注明C# 中的 ref 或 out 参数,但此办法可以调用具有此类参数的章程。

 

应用程序区域

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

Web 访问

HttpClient SyndicationClient

使用文件

StorageFileStreamWriterStreamReaderXmlReader

使用图像

MediaCaptureBitmapEncoderBitmapDecoder

WCF 编程

同步和异步操作

   

应用程序区域

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

Web 访问

HttpClient SyndicationClient

使用文件

StorageFileStreamWriterStreamReaderXmlReader

使用图像

MediaCaptureBitmapEncoderBitmapDecoder

WCF 编程

同步和异步操作

   

八 、命名的预定

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

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

 

鉴于全部与用户界面相关的运动一般共享二个线程,因而,异步对走访
UI 线程的应用程序来说更是首要。 假设别的进度在一块应用程序中受阻,则有着进度都将受阻。 你的应用程序停止响应,因而,你只怕在其等待进程中以为它曾经破产。

由于全数与用户界面相关的活动一般共享叁个线程,因而,异步对走访
UI 线程的应用程序来说尤为首要。 借使别的进度在共同应用程序中受阻,则拥有进程都将受阻。 你的应用程序结束响应,因而,你也许在其等待进程中认为它已经破产。

传送门 

 


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

 

 

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

的异步编制程序,并发编制程序经典实例。行使异步方法时,应用程序将继承响应
UI。 例如,你能够调动窗口的大大小小或最小化窗口;尽管您不希望等待应用程序甘休,则能够将其倒闭。

运用异步方法时,应用程序将一连响应
UI。 例如,你能够调整窗口的轻重缓急或最小化窗口;固然你不期待等待应用程序甘休,则足以将其倒闭。

当设计异步操作时,该基于异步的格局将活动传输的一模一样对象添加到可从中选拔的选项列表中。 开发职员只须要投入较少的工作量即可使您得到守旧异步编制程序的兼具优点。

当设计异步操作时,该基于异步的措施将机关传输的一致对象添加到可从中挑选的选项列表中。 开发职员只需求投入较少的工作量即可使您拿走守旧异步编制程序的有所优点。

异步方法更便于编写

异步方法更易于编写

 

 

 

 

Visual
Basic
中的 Async 和 Await 关键字,以及
C#
中的 async 和 await 关键字都以异步编制程序的主干。 通过应用这七个基本点字,你能够利用
.NET framework 或 Windows
运转时中的能源轻松创立异步方法(大概与创设同步方法同样轻松)。 通过运用被称之为异步方法的
async 和 await 定义的异步方法。

Visual
Basic
中的 Async 和 Await 关键字,以及
C#
中的 async 和 await 关键字都是异步编制程序的核心。 通过选择那四个首要字,你能够运用
.NET framework 或 Windows
运转时中的能源轻松创立异步方法(大致与创制同步方法同样轻松)。 通过接纳被誉为异步方法的
async 和 await 定义的异步方法。

下边包车型大巴示范演示了一种异步方法。 你应对代码中的大概拥有内容都丰盛熟识。 注释调出你添加的用来创制异步的功力。

下边包车型地铁演示演示了一种异步方法。 你应对代码中的差不离拥有内容都十一分理解。 注释调出你添加的用来创设异步的法力。

您能够在本核心的末梢找到完整的言传身教育和文化件,并且能够从 Async
示例:“使用 Async 和 Await
实行异步编制程序”的以身作则下载此示例。

您能够在本大旨的末梢找到完整的言传身教育和文化件,并且能够从 Async
示例:“使用 Async 和 Await
举行异步编程”的以身作则下载此示例。

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

即便 AccessTheWebAsync 在调用 GetStringAsync 和等候其形成期间不可能拓展别的工作,则你能够通过在上面包车型客车单个语句中调用和等候来简化代码。

假使 AccessTheWebAsync 在调用 GetStringAsync 和等候其实现时期不能够开展别的工作,则你能够透过在下边的单个语句中调用和等候来简化代码。

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

以下特征总括了使上一个演示成为异步方法的缘由。

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

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

  • 服从约定,异步方法的称号以“Async”后缀为终极。

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

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

    • 借使您的方法没有再次回到语句或具有没有操作数的回来语句,则为 Task。

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

    有关详细音信,请参见本主题前边的“再次回到类型和参数”。

  • 方法一般包含至少一个await
    表明式,该表达式标记三个点,在该点上,直到等待的异步操作完结章程才能一而再。 同时,将艺术挂起,并且控件再次回到到方法的调用方。 本大旨的下一节将表明悬挂点产生的境况。

  • 主意签名包蕴1个 Async 或 async 修饰符。

  • 依据预约,异步方法的称谓以“Async”后缀为结尾。

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

    • 假诺您的方法有操作数为
      TResult
      类型的回来语句,则为 Task<TResult>。

    • 借使您的主意没有回来语句或富有没有操作数的回到语句,则为 Task。

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

    有关详细消息,请参见本宗旨前边的“再次回到类型和参数”。

  • 措施一般包蕴至少一个await
    表明式,该表明式标记叁个点,在该点上,直到等待的异步操作完毕章程才能三番四回。 同时,将艺术挂起,并且控件再次来到到情势的调用方。 本大旨的下一节将表达悬挂点发生的图景。

在异步方法中,可选取提供的重要字和种类来提醒必要实现的操作,且编写翻译器会完结别的操作,当中包蕴不断跟踪控件以挂起方法再次来到等待点时发生的气象。 一些好端端流程(例如,循环和丰富处理)在古板异步代码中处理起来大概很困难。 在异步方法中,成分的编纂频率与协同消除方案相同且此题材取得消除。

在异步方法中,可应用提供的第壹字和花色来提示必要实现的操作,且编写翻译器会形成其他操作,在那之中囊括不断跟踪控件以挂起方法重临等待点时爆发的境况。 一些健康流程(例如,循环和至极处理)在古板异步代码中处理起来只怕很不便。 在异步方法中,成分的编纂频率与一起消除方案相同且此题材取得缓解。

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

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

异步方法中发生的事情

异步方法中发出的工作

 

 

 

 

异步编制程序中最需弄清的是控制流是怎么着从点子移动到情势的。 下图可指引你完毕该进度。

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

4858.com 1

4858.com 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> 重返至调用方。 该职分表示对发生下载字符串长度的平头结果的1个承诺。

    注意

    如果 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 是水到渠成其工作并回到其调用方的2只方法。

  6. AccessTheWebAsync 已用竣事作,能够不受 getStringTask 的结果影响。 接下来,AccessTheWebAsync 须求总括并回到该下载字符串的长度,但该方式仅在享有字符串时才能总计该值。

    据此,AccessTheWebAsync 使用2个 await
    运算符来挂起其速度,并把控制权交给调用 AccessTheWebAsync 的艺术。AccessTheWebAsync 将 Task(Of
    Integer)
     或 Task<int> 再次回到至调用方。 该职务表示对发生下载字符串长度的整数结果的一个承诺。

    注意

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

    在调用方内部(此示例中的事件处理程序),处理情势将继续。 在守候结果前,调用方能够开始展览不依赖于 AccessTheWebAsync 结果的其余工作,不然就需等待片刻。 事件处理程序等待 AccessTheWebAsync,而 AccessTheWebAsync 等待 GetStringAsync

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

  8. 当 AccessTheWebAsync 具有字符串结果时,该格局能够总计字符串长度。 然后,AccessTheWebAsync 工作也将做到,并且等待事件处理程序可继续应用。 在此大旨结尾处的完好示例中,可确认事件处理程序检索并打字与印刷长度结果的值。

即便你面生异步编制程序,请花
1 分钟时间考虑共同行为和异步行为之间的出入。 当其工作成就时(第⑥ 步)会回来一个合伙方法,但当其工作挂起时(第 3 步和第 6
步),异步方法会重返二个职务值。 在异步方法最后完毕其行事时,职分会标记为已到位,而结果(如若有)将积存在职务中。

尽管您不熟稔异步编制程序,请花
1 分钟时间考虑共同行为和异步行为之间的差异。 当其工作成功时(第⑤ 步)会回来八个一并方法,但当其工作挂起时(第 3 步和第 6
步),异步方法会重回一个职分值。 在异步方法最终成功其行事时,职务会标记为已到位,而结果(假设有)将积存在职责中。

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

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

API 异步方法

API 异步方法

 

 

 

 

你恐怕想清楚从何方能够找到 GetStringAsync 等支撑异步编程的方法。.NET
Framework 4.5 包括使用 async 和 await 的过多成员。 可以透过附加到成员名称的“Async”后缀和 Task 或 Task<TResult> 的归来类型识别这几个成员。 例如,System.IO.Stream
类包蕴的不二法门CopyToAsync、ReadAsync、WriteAsync 等措施以及联合方法 CopyTo、Read 和 Write。

你也许想精通从何处能够找到 GetStringAsync 等支持异步编制程序的措施。.NET
Framework 4.5 包罗使用 async 和 await 的过多成员。 能够经过附加到成员名称的“Async”后缀和 Task 或 Task<TResult> 的回到类型识别这几个成员。 例如,System.IO.Stream
类包罗的法门CopyToAsync、ReadAsync、WriteAsync 等格局以及协同方法 CopyTo、Read 和 Write。

Windows
运维时还蕴涵众多在 Windows 8.x 应用企业应用中可与 async 和 await
一起行使的法子。 有关更多音信和演示方法,请参见高效入门:将
await
运算符用于异步编制程序、异步编制程序(Windows
应用集团应用)和WhenAny:.NET
Framework 和 Windows 运营时之间的桥接(C# 和 Visual
Basic)。

Windows
运维时还富含众多在 Windows 8.x 应用商店应用中可与 async 和 await
一起行使的法门。 有关越来越多音信和示范方法,请参见迅猛入门:将
await
运算符用于异步编制程序、异步编制程序(Windows
应用商店应用)和WhenAny:.NET
Framework 和 Windows 运转时之间的桥接(C# 和 Visual
Basic)。

4858.com ,线程

线程

 

 

 

 

异步方法意在成为非阻止操作。 异步方法中的
await 表达式在等待的职分正在运行时不会阻止当前线程。 相反,表明式在一连时登记格局的其他部分并将控件重回到异步方法的调用方。

异步方法意在成为非阻止操作。 异步方法中的
await 表达式在伺机的职责正在运营时不会阻碍当前线程。 相反,表明式在此起彼伏时登记方式的其他部分并将控件再次回到到异步方法的调用方。

async
和 await 关键字不会招致创造其余线程。 因为异步方法不会在其本人线程上运维,因而它不要求二十八线程。 唯有当方法处于活动状态时,该方法将在时下一并上下文中运作并行使线程上的岁月。 能够动用 Task.Run 将占用大批量CPU
的干活移到后台线程,然而后台线程不会帮助正在守候结果的历程变为可用状态。

async
和 await 关键字不会促成创制其余线程。 因为异步方法不会在其自个儿线程上运维,因此它不需求多线程。 唯有当方法处于活动状态时,该措施将在此时此刻联手上下文中运营并接纳线程上的光阴。 能够使用 Task.Run 将占据大批量CPU
的干活移到后台线程,然则后台线程不会扶助正在等候结果的进度变为可用状态。

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

对于异步编制程序而言,该基于异步的点子优于差不离各个用例中的现有措施。 具体而言,此办法比 BackgroundWorker 更适用于
IO 绑定的操作,因为此代码更简约且无需提防争用规范。 结合 Task.Run 使用时,异步编制程序比 BackgroundWorker 更适用于
CPU
绑定的操作,因为异步编制程序将运转代码的协调细节与 Task.Run 传输至线程池的劳作分别开来。

异步和等候

异步和等待

 

 

 

 

如若通过运用 Async 或 async 修饰符钦定某种格局为异步方法,则足以启用以下四个效益。

如若通过利用 Async 或 async 修饰符内定某种方式为异步方法,则足以启用以下四个成效。

  • 标志的异步方法能够使用 Await 或 await 来钦点悬挂点。 await
    运算符布告编写翻译器异步方法唯有直到等待的异步进度完结才能继续透过该点。同时,控件重临至异步方法的调用方。

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

  • 标记的异步方法自身能够由此调用它的艺术等待。

  • 标记的异步方法能够利用 Await 或 await 来钦定悬挂点。 await
    运算符布告编写翻译器异步方法只有直到等待的异步进程完结才能继续透过该点。同时,控件重临至异步方法的调用方。

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

  • 标记的异步方法本人能够经过调用它的点子等待。

异步方法一般包蕴await 运算符的2个或多个匹配项,但缺少 await
表达式不会造成编写翻译器错误。 若是异步方法未采取await
运算符标记悬挂点,则该办法将用香港作家联谊相会方法执行,不管异步修饰符如何。 编写翻译器将为此类措施发表3个警示。

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

AsyncasyncAwait 和 await 皆此前后文关键字。 有关越多音信和示范,请参见以下核心:

AsyncasyncAwait 和 await 都以内外文关键字。 有关更加多音讯和演示,请参见以下大旨:

  •  Async
    (Visual
    Basic)

  • async(C#
    参考)

  • Await 运算符 (Visual
    Basic)

  • await(C#
    参考)

  •  Async
    (Visual
    Basic)

  • async(C#
    参考)

  • Await 运算符 (Visual
    Basic)

  • await(C#
    参考)

归来类型和参数

回去类型和参数

 

 

 

 


.NET Framework
编制程序中,异步方法一般重临 Task 或 Task<TResult>。 在异步方法中,await
运算符应用于通过调用另一个异步方法重回的任务。


.NET Framework
编制程序中,异步方法一般重回 Task 或 Task<TResult>。 在异步方法中,await
运算符应用于通过调用另一个异步方法重临的职务。

设若格局包罗内定 TResult 类型的操作数的 Return (Visual
Basic)
或 return (C#)
语句,则将 Task<TResult> 钦点为回去类型。

假若格局包罗钦定 TResult 类型的操作数的 Return (Visual
Basic)
或 return (C#)
语句,则将 Task<TResult> 钦点为回去类型。

若果格局不含任何
return 语句或含有不回去操作数的 return
语句,则将 Task 用作再次来到类型。

若是格局不含任何
return 语句或包涵不回去操作数的 return
语句,则将 Task 用作再次回到类型。

上边包车型客车演示演示怎么样注明并调用可回到 Task<TResult> 或 Task 的方法。

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

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

每个重返的任务表示正在开始展览的劳作。 义务可包裹有关异步进度景况的音信,要是未中标,则最终会卷入来自过程的结尾结果或进程引发的不行。

各种再次来到的职务表示正在进展的工作。 职务可包裹有关异步进度意况的新闻,假设未中标,则最终会卷入来自进度的尾声结出或进度引发的百般。

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

异步方法还足以是 Sub 方法
(Visual Basic) 或具有 void 再次回到类型 (C#)。 该重返类型主要用以定义须求 void 再次回到类型的事件处理程序。 异步事件处理程序日常作为异步程序的初始点。

无所适从等待为 Sub 程序或享有 void 再次回到类型的异步方法,并且无效的回来方法的调用方不可能捕获该格局引发的任何特别。

没辙等待为 Sub 程序或具备 void 再次来到类型的异步方法,并且无效的回来方法的调用方不能捕获该格局引发的其他极度。

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

异步方法不可能表明Visual Basic
中的 ByRef 参数或
C#
中的 ref 或 out 参数,但此格局能够调用具有此类参数的方法。

有关越来越多消息和演示,请参见异步再次回到类型(C#
和 Visual
Basic)。 有关怎样在异步方法中捕捉至极的更加多新闻,请参阅try-catch(C#
参考)或Try…Catch…Finally
语句 (Visual
Basic)。

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

Windows
运转时编制程序中的异步 API 具有下列重临类型之一,它好像于职务:

Windows
运营时编制程序中的异步 API 具有下列重回类型之一,它就像于任务:

  • IAsyncOperation,它对应于 Task<TResult>

  • IAsyncAction,它对应于 Task

  • IAsyncActionWithProgress

  • IAsyncOperationWithProgress

  • IAsyncOperation,它对应于 Task<TResult>

  • IAsyncAction,它对应于 Task

  • IAsyncActionWithProgress

  • IAsyncOperationWithProgress

有关越来越多消息和示范,请参见火速入门:将
await
运算符用于异步编制程序。

有关越来越多新闻和示范,请参见快快入门:将
await
运算符用于异步编制程序。

取名约定

命名约定

 

 

 

 

依据预订,将“Async”追加到独具 Async 或 async 修饰符的不二法门的名目。

依照预约,将“Async”追加到持有 Async 或 async 修饰符的点子的名目。

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

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

连带核心

相关主旨

标题

描述

示例

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

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

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

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

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

 

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

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

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

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

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

 

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

 

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

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

 

Task-based Asynchronous Pattern (TAP)

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

 

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

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

 

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

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

 

第 9 频道上的异步视频

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

 

标题

描述

示例

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

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

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

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

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

 

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

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

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

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

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

 

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

 

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

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

 

Task-based Asynchronous Pattern (TAP)

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

 

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

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

 

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

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

 

第 9 频道上的异步视频

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

 

完全的示范

一体化的言传身教

 

 

 

 

上面包车型大巴代码是缘于于本主旨探讨的
Windows Presentation Foundation (WPF) 应用程序的 MainWindow.xaml.vb 或
MainWindow.xaml.cs 文件。 能够从 异步示例:“使用
Async 和 Await
举行异步编制程序”的示范中下载示例。

下边包车型大巴代码是来源于于本大旨商讨的
Windows Presentation Foundation (WPF) 应用程序的 MainWindow.xaml.vb 或
MainWindow.xaml.cs 文件。 能够从 异步示例:“使用
Async 和 Await
进行异步编制程序”的演示中下载示例。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Windows;
 7 using System.Windows.Controls;
 8 using System.Windows.Data;
 9 using System.Windows.Documents;
10 using System.Windows.Input;
11 using System.Windows.Media;
12 using System.Windows.Media.Imaging;
13 using System.Windows.Navigation;
14 using System.Windows.Shapes;
15 
16 // Add a using directive and a reference for System.Net.Http;
17 using System.Net.Http;
18 
19 namespace AsyncFirstExample
20 {
21     public partial class MainWindow : Window
22     {
23         // Mark the event handler with async so you can use await in it.
24         private async void StartButton_Click(object sender, RoutedEventArgs e)
25         {
26             // Call and await separately.
27             //Task<int> getLengthTask = AccessTheWebAsync();
28             //// You can do independent work here.
29             //int contentLength = await getLengthTask;
30 
31             int contentLength = await AccessTheWebAsync();
32 
33             resultsTextBox.Text +=
34                 String.Format("\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地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有