《C#并发编程经典实例》学习笔记—异步编程关键字 Async和Await – repeatedly

C# 启动异步并等候,居于首位地。净 Framework 4.5引入,可以在Visual Studio 2012年运用。至此的异步节目施行异议较高,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

在不维持的平台上,定位于Nuget包

运用 async 修正器可以修正方式、lambda 表现或隐姓埋名方式指派为异步。

async 下面所说的事方式做了什么

运用异步润色符修正可以从IL法典中诱出裁决。:

  • 调试中,柜台异步方式,构筑的是类声明机
  • 在使分娩,柜台异步方式,构筑的是创作声明机

插图画家:
C法典如次

using System.Threading.Tasks;

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

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

本试验同时在的方式

Release下 设定初值声明机V_0 ,典型是值典型创作valuetype),典型解释为d__0

    .locals init (
      [0] valuetype ConsoleApp3.Test/''d__0'' V_0,
      [1] valuetype [摩根士坦利资金国际将存入银行]System.Runtime.CompilerServices.AsyncTaskMethodBuilder V_1
    )

d__0 承受值典型[摩根士坦利资金国际将存入银行]System.ValueType

.class nested private sealed auto ansi beforefieldinit 
    ''d__0''
      extends [摩根士坦利资金国际将存入银行]System.ValueType
      implements [摩根士坦利资金国际将存入银行]

Debug 下 设定初值声明机V_0 ,典型是援用典型clasclass) ,典型解释为d__0

    .locals init (
      [0] class ConsoleApp3.Test/''d__0'' V_0,
      [1] valuetype [摩根士坦利资金国际将存入银行]System.Runtime.CompilerServices.AsyncTaskMethodBuilder V_1
    )

d__0 承受援用典型[摩根士坦利资金国际将存入银行]System.Object

  .class nested private sealed auto ansi beforefieldinit 
    ''d__0''
      extends [摩根士坦利资金国际将存入银行]System.Object
      implements [摩根士坦利资金国际将存入银行]

异步方式的限界和有关留意事项

运用 async 键入词限界的异步方式省略为“异步方式”。

有关留意事项:

  • 假使 async 键入词修正方式以前的男朋友或女朋友 await 表现或申请有特殊教育需求,后来地同时在的表现该方式。 汇编者正告将通告您它以前的男朋友或女朋友 await 申请有特殊教育需求的究竟哪任何人异步方式,因这能够述语任何人颠倒的。 求教于汇编者正告(规模) 1)CS4014。
  • async 键入词是语境键入词,呈现是可是当它被修正时、lambda 表现或隐姓埋名方式,这是键入词。。 在尽量的别的经济状况下,它们被解说为间歇。
  • 不要用它。 void 作为 async 方式重提典型! async 方式可以重提 void ,但这仅限于写信事变处置顺序。任何人普通的 async 缺勤重提值的方式,要重提Task ,而过失 void
  • 一定要克制不要运用Task.Result 方式,因它们会事业僵局。假使运用了 async ,最好一向用它。
  • 异步方式的限制因素不克不及运用outrefoutref 重提的datum的复数霉臭BorroweTask 重提,可以运用元组或自限界datum的复数创作。

异步方式的特点

  • 方式署名牵制 async 润色符。
  • 依照商定,异步方式的解释以“Async”后缀煞尾。
  • 重提典型是以下典型经过:
    • 假使方式有操算数 TResult 典型重提申请有特殊教育需求,则为 Task
    • 假使方式缺勤带有n的重提申请有特殊教育需求或重提申请有特殊教育需求,则为 Task
    • void:假使要写信异步事变处置顺序。
    • 牵制 GetAwaiter 究竟哪任何人别的典型的方式(源自 C# 起)。
  • 任何人方式通常至多牵制 await 表现,此表现标识表记标帜任何人点,在该点上,直到等候的异步管理应验方式才干持续。 同时,把方式挂起来,支配重提到方式的大声喊方。

异步和awai的详细表现工序,方式在那时挂断并使分娩,请一致的异步顺序做成某事把持流 (C#)

异步重提典型

下面提到 void 作为酬谢,一致的事变处置顺序。
插图画家:

using System;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    public class TestVoidAsync
    {
        private event EventHandler DoTest;

        public TestVoidAsync()
        {
            DoTest += DoTestEvent;
        }

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

        protected virtual void OnDoTest()
        {
            do的第二人称单数现在式?.invoke(此, );
        }
    }
}

void 作为酬谢在任何人滥治:无法值得努力争取的东西非常。

重提 void 的异步方式的大声喊方无法值得努力争取的东西从该方式起动装置的非常,这些未处置的非常能够事业应用顺序输掉。 假使重提 TaskTask 的异步方式中呈现非常,此非常将希腊字母第12字在重提的TA中,在等候伙计时再次跳跃。

盛行的异步重提典型:

从 C# 开端,异步方式可重提究竟哪任何人具有可采访的 GetAwaiter 方式的典型。

ValueTask

Task 和 Task 是援用典型,这么,功能键入路程做成某事内存分结成夫妇功能有负面影响,格外在紧凑包围中举行分派时。 维持盛行重提典型述语轻量级值典型(过失refe,克制不要额定的内存分派。

运用ValueTask,需求添加Nuget包

ValueTask 是创作值典型,Task 和 Task 是类援用典型

异步管理的生活时代

Task 类预备了异步管理的生活时代,决定时代b TaskStatus 点查表现法。

Created 0 任命已设定初值,但还没有设计。。
WaitingForActivation 1 此任命在等候。氖 Framework infrastructure 室内的致敏和调整。
WaitingToRun 2 该任命已改编施行,但还没有开端。。
Running 3 在运转但还没有应验的任命。
WaitingForChildrenToComplete 4 已应验的任命,并隐式等候别的子任命应验。
RanToCompletion 5 任命已成应验。
Canceled 6 起动装置 OperationCanceledException 非常,或许在任命开端表现垄断偿还它
Faulted 7 鉴于未处置的非常,任命已应验。

Canceled 和 鉴于任命非常,毛病声明替换为该声明。二者的分别如次:

假使有标识表记标帜 IsCancellationRequested 属性重提 false,或许非常的标识表记标帜与TA的标识表记标帜不婚配,会的。 OperationCanceledException 本着罕见非常举行处置,这将事业任命替换为 Faulted 声明。 还要留意,别的非常的在将也会事业任命替换为 Faulted 声明。 你可以在 Status 获取属性中已应验任命的声明。

一致的文字:

发表评论

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