zoukankan      html  css  js  c++  java
  • .net异步编程async和await的讨论收获

    微软官方描述:

    C# 5 引入了一种简便方法,即异步编程。此方法利用了 .NET Framework 4.5 及更高版本、.NET Core 和 Windows 运行时中的异步支持。 编译器可执行开发人员曾进行的高难度工作,且应用程序保留了一个类似于同步代码的逻辑结构。因此,你只需做一小部分工作就可以获得异步编程的所有好处。

    异步编程提升响应能力

    异步对可能会被屏蔽的活动(如 Web 访问)至关重要。 对 Web 资源的访问有时很慢或会延迟。 如果此类活动在同步过程中被屏蔽,整个应用必须等待。 在异步过程中,应用程序可继续执行不依赖 Web 资源的其他工作,直至潜在阻止任务完成。

    下表显示了异步编程提高响应能力的典型区域。 列出的 .NET 和 Windows 运行时 API 包含支持异步编程的方法。

    应用程序区域包含异步方法的 .NET 类型包含异步方法的 Windows 运行时类型
    Web 访问 HttpClient SyndicationClient
    使用文件 StreamWriterStreamReader,XmlReader StorageFile
    使用图像   MediaCaptureBitmapEncoderBitmapDecoder
    WCF 编程 同步和异步操作  

    由于所有与用户界面相关的活动通常共享一个线程,因此,异步对访问 UI 线程的应用程序来说尤为重要。 如果任何进程在同步应用程序中受阻,则所有进程都将受阻。 你的应用程序停止响应,因此,你可能在其等待过程中认为它已经失败。

    下面是微软官方的示例:

    // Three things to note in the signature:  
    //  - The method has an async modifier.   
    //  - The return type is Task or Task<T>. (See "Return Types" section.)  
    //    Here, it is Task<int> because the return statement returns an integer.  
    //  - The method name ends in "Async."  
    async Task<int> AccessTheWebAsync()  
    {   
        // You need to add a reference to System.Net.Http to declare client.  
        HttpClient client = new HttpClient();  
    
        // GetStringAsync returns a Task<string>. That means that when you await the  
        // task you'll get a string (urlContents).  
        Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");  
    
        // You can do work here that doesn't rely on the string from GetStringAsync.  
        DoIndependentWork();  
    
        // The await operator suspends AccessTheWebAsync.  
        //  - AccessTheWebAsync can't continue until getStringTask is complete.  
        //  - Meanwhile, control returns to the caller of AccessTheWebAsync.  
        //  - Control resumes here when getStringTask is complete.   
        //  - The await operator then retrieves the string result from getStringTask.  
        string urlContents = await getStringTask;  
    
        // The return statement specifies an integer result.  
        // Any methods that are awaiting AccessTheWebAsync retrieve the length value.  
        return urlContents.Length;  
    }  

    如果 AccessTheWebAsync 在调用 GetStringAsync 和等待其完成期间不能进行任何工作,则你可以通过在下面的单个语句中调用和等待来简化代码。

    C#
    string urlContents = await client.GetStringAsync();  
    

    以下特征总结了使上一个示例成为异步方法的原因。

    • 方法签名包含 async 修饰符。

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

    • 返回类型为下列类型之一:

      • 如果你的方法有操作数为 TResult 类型的返回语句,则为Task<TResult>

      • 如果你的方法没有返回语句或具有没有操作数的返回语句,则为Task

      • Void:如果要编写异步事件处理程序。

      • 包含 GetAwaiter 方法的其他任何类型(自 C# 7 起)。

      有关详细信息,请参见本主题后面的“返回类型和参数”。

    • 方法通常包含至少一个 await 表达式,该表达式标记一个点,在该点上,直到等待的异步操作完成方法才能继续。 同时,将方法挂起,并且控件返回到方法的调用方。 本主题的下一节将解释悬挂点发生的情况。

    对于异步编程而言,该基于异步的方法优于几乎每个用例中的现有方法。 具体而言,此方法比 BackgroundWorker 类更适用于 IO 绑定操作,因为此代码更简单且无需防止争用条件。 结合 Task.Run 方法使用时,异步编程比 BackgroundWorker 更适用于 CPU 绑定操作,因为异步编程将运行代码的协调细节与 Task.Run 传输至线程池的工作区分开来。

  • 相关阅读:
    DataTableToJSON
    css hack
    把网络数据流转换成图片类
    递归(转)
    SQL 锁
    观察者
    yield
    开闭原则(转)
    迪米特法则(最少知道原则)(转)
    sql 游标
  • 原文地址:https://www.cnblogs.com/Tpf386/p/8335630.html
Copyright © 2011-2022 走看看