windows C#-异步编程模型(下)

server/2024/11/25 5:03:08/
API 异步方法

你可能想知道从何处可以找到 GetStringAsync 等支持异步编程的方法。 .NET Framework 4.5 或更高版本以及 .NET Core 包含许多可与 async 和 await 结合使用的成员。 可以通过追加到成员名称的“Async”后缀和 Task 或 Task<TResult> 的返回类型,识别这些成员。 例如,System.IO.Stream 类包含 CopyToAsync、ReadAsync 和 WriteAsync 等方法,以及同步方法 CopyTo、Read 和 Write。

Windows 运行时也包含许多可以在 Windows 应用中与 async 和 await 结合使用的方法。

线程

异步方法旨在成为非阻止操作。 异步方法中的 await 表达式在等待的任务正在运行时不会阻止当前线程。 相反,表达式在继续时注册方法的其余部分并将控件返回到异步方法的调用方。

async 和 await 关键字不会创建其他线程。 因为异步方法不会在其自身线程上运行,因此它不需要多线程。 只有当方法处于活动状态时,该方法将在当前同步上下文中运行并使用线程上的时间。 可以使用 Task.Run 将占用大量 CPU 的工作移到后台线程,但是后台线程不会帮助正在等待结果的进程变为可用状态。

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

async 和 await

如果使用 async 修饰符将某种方法指定为异步方法,即启用以下两种功能。

标记的异步方法可以使用 await 来指定暂停点。 await 运算符通知编译器异步方法:在等待的异步过程完成后才能继续通过该点。 同时,控制返回至异步方法的调用方。

异步方法在 await 表达式执行时暂停并不构成方法退出,只会导致 finally 代码块不运行。

标记的异步方法本身可以通过调用它的方法等待。

异步方法通常包含 await 运算符的一个或多个实例,但缺少 await 表达式也不会导致生成编译器错误。 如果异步方法未使用 await 运算符标记暂停点,则该方法会作为同步方法执行,即使有 async 修饰符,也不例外。 编译器将为此类方法发布一个警告。

async 和 await 都是上下文关键字。 

返回类型和参数

异步方法通常返回 Task 或 Task<TResult>。 在异步方法中,await 运算符应用于通过调用另一个异步方法返回的任务。

如果方法包含指定 TResult 类型操作数的 return 语句,将 Task<TResult> 指定为返回类型。

如果方法不含任何 return 语句或包含不返回操作数的 return 语句,则将 Task 用作返回类型。

还可以指定任何其他返回类型,前提是类型包含 GetAwaiter 方法。 例如,ValueTask<TResult> 就是这种类型。 可用于 System.Threading.Tasks.Extension NuGet 包。

下面的示例演示如何声明并调用可返回 Task<TResult> 或 Task 的方法:

async Task<int> GetTaskOfTResultAsync()
{int hours = 0;await Task.Delay(0);return hours;
}Task<int> returnedTaskTResult = GetTaskOfTResultAsync();
int intResult = await returnedTaskTResult;
// Single line
// int intResult = await GetTaskOfTResultAsync();async Task GetTaskAsync()
{await Task.Delay(0);// No return statement needed
}Task returnedTask = GetTaskAsync();
await returnedTask;
// Single line
await GetTaskAsync();

每个返回的任务表示正在进行的工作。 任务可封装有关异步进程状态的信息,如果未成功,则最后会封装来自进程的最终结果或进程引发的异常。

异步方法也可以具有 void 返回类型。 该返回类型主要用于定义需要 void 返回类型的事件处理程序。 异步事件处理程序通常用作异步程序的起始点。

无法等待具有 void 返回类型的异步方法,并且无效返回方法的调用方捕获不到异步方法引发的任何异常。

异步方法无法声明 in、ref 或 out 参数,但可以调用包含此类参数的方法。 同样,异步方法无法通过引用返回值,但可以调用包含 ref 返回值的方法。

Windows 运行时编程中的异步 API 具有下列返回类型之一(类似于任务):

IAsyncOperation<TResult>(对应于 Task<TResult>)
IAsyncAction(对应于 Task)
IAsyncActionWithProgress<TProgress>
IAsyncOperationWithProgress<TResult,TProgress>

命名约定

按照约定,返回常规可等待类型的方法(例如 Task、Task<T>、ValueTask 和 ValueTask<T>)应具有以“Async”结束的名称。 启动异步操作但不返回可等待类型的方法不得具有以“Async”结尾的名称,但其开头可以为“Begin”、“Start”或其他表明此方法不返回或引发操作结果的动词。

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


http://www.ppmy.cn/server/144710.html

相关文章

聊一聊Elasticsearch的索引(1)

本文主要对ES索引的映射、路由规则、别名、滚动索引进行整理和介绍。 1、映射 ES是通过索引映射来建立索引结构&#xff0c;索引映射相当于数据库的数据字典&#xff0c;定义了每个字段的名称以及所能保存的数据类型。 索引的映射创建后&#xff0c;后续还可以在映射上添加新…

数据结构(C语言版)-2.栈和队列

顺序存储结构实现 SeqString.h #ifndef __SEQSTRING_H__ #define __SEQSTRING_H__ #define MAXSIZE 256 typedef struct {char data[MAXSIZE];int len; }SeqString;int StrLength(char *s); int StrCat(char s1[],char s2[]); int SubStr(char* s, char t[], int i, int len); …

如何在 Ubuntu 22.04 上安装带有 Nginx 的 ELK Stack

今天我们来聊聊如何在 Ubuntu 22.04 服务器上安装 ELK Stack&#xff0c;并集成 Nginx 作为 Web 服务器&#xff0c;同时使用 Let’s Encrypt Certbot 进行 SSL 认证。ELK Stack&#xff0c;包括 Elasticsearch、Logstash 和 Kibana&#xff0c;是一套强大的工具&#xff0c;用…

长文解读:OSAID 1.0,全球首个开源AI标准,审视探讨其对AI行业实践开源的影响

引言 在人工智能&#xff08;AI&#xff09;的快速发展中&#xff0c;开源已经成为推动技术创新和知识共享的重要力量。随着AI技术的广泛应用&#xff0c;确保其开放性、透明性和可访问性变得至关重要。在这样的背景下&#xff0c;OSAID 1.0&#xff08;Open Source AI Defini…

Java语言程序设计 选填题知识点总结

第一章 javac.exe是JDK提供的编译器public static void main (String args[])是Java应用程序主类中正确的main方法Java源文件是由若干个书写形式互相独立的类组成的Java语言的名字是印度尼西亚一个盛产咖啡的岛名Java源文件中可以有一个或多个类Java源文件的扩展名是.java如果…

[数组双指针] 0167. 两数之和 II - 输入有序数组

文章目录 1. 题目链接2. 题目大意3. 示例4. 解题思路5. 参考代码 1. 题目链接 167. 两数之和 II - 输入有序数组 - 力扣&#xff08;LeetCode&#xff09; 2. 题目大意 描述&#xff1a;给定一个下标从 1 开始计数、升序排列的整数数组&#xff1a;numbers 和一个目标值 targ…

Docker 实践与应用举例:提升开发与运维效率的利器

Docker 是一个开源的容器化平台,用于自动化部署、扩展和管理应用程序。它通过将应用及其依赖打包成容器,能够使得开发、测试、部署和生产环境中的应用一致性得以保证。在本文中,我们将深入探讨 Docker 的基础知识、安装与配置,结合实际案例展示 Docker 在开发和运维中的强大…

【操作系统】每日 3 题(三十六)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12820365.html &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享操作系统面试中常见的面试题给大家~ ❤️…