windows C#-异步返回类型(上)

news/2024/11/23 9:21:56/

异步方法可以具有以下返回类型:

  • Task(对于执行操作但不返回任何值的异步方法)。
  • Task<TResult>(对于返回值的异步方法)。
  • void(对于事件处理程序)。
  • 任何具有可访问的 GetAwaiter 方法的类型。 GetAwaiter 方法返回的对象必须实现 System.Runtime.CompilerServices.ICriticalNotifyCompletion 接口。
  • IAsyncEnumerable<T>(对于返回异步流的异步方法)。

还存在特定于 Windows 工作负载的其他几种类型:

  • DispatcherOperation,适用于仅限于 Windows 的异步操作。
  • IAsyncAction,适用于 UWP 中不返回值的异步操作。
  • IAsyncActionWithProgress<TProgress>,适用于 UWP 中只报告进程但不返回值的异步操作。
  • IAsyncOperation<TResult>,适用于 UWP 中返回值的异步操作。
  • IAsyncOperationWithProgress<TResult,TProgress>,适用于 UWP 中既报告进程又返回值的异步操作。
Task 返回类型

不包含 return 语句的异步方法或包含不返回操作数的 return 语句的异步方法通常具有返回类型 Task。 如果此类方法同步运行,它们将返回 void。 如果在异步方法中使用 Task 返回类型,调用方法可以使用 await 运算符暂停调用方的完成,直至被调用的异步方法结束。

下例中的 WaitAndApologizeAsync 方法不包含 return 语句,因此该方法会返回 Task 对象。 返回 Task 可等待 WaitAndApologizeAsync。 Task 类型不包含 Result 属性,因为它不具有任何返回值。

public static async Task DisplayCurrentInfoAsync()
{await WaitAndApologizeAsync();Console.WriteLine($"Today is {DateTime.Now:D}");Console.WriteLine($"The current time is {DateTime.Now.TimeOfDay:t}");Console.WriteLine("The current temperature is 76 degrees.");
}static async Task WaitAndApologizeAsync()
{await Task.Delay(2000);Console.WriteLine("Sorry for the delay...\n");
}
// Example output:
//    Sorry for the delay...
//
// Today is Monday, August 17, 2020
// The current time is 12:59:24.2183304
// The current temperature is 76 degrees.

通过使用 await 语句而不是 await 表达式等待 WaitAndApologizeAsync,类似于返回 void 的同步方法的调用语句。 Await 运算符的应用程序在这种情况下不生成值。 当 await 的右操作数是 Task<TResult> 时,await 表达式生成的结果为 T。 当 await 的右操作数是 Task 时,await 及其操作数是一个语句。

可从 await 运算符的应用程序中分离对 WaitAndApologizeAsync 的调用,如以下代码所示。 但是,请记住,Task 没有 Result 属性,并且当 await 运算符应用于 Task 时不产生值。

以下代码将调用 WaitAndApologizeAsync 方法和等待此方法返回的任务分离。

Task waitAndApologizeTask = WaitAndApologizeAsync();string output =$"Today is {DateTime.Now:D}\n" +$"The current time is {DateTime.Now.TimeOfDay:t}\n" +"The current temperature is 76 degrees.\n";await waitAndApologizeTask;
Console.WriteLine(output);
Task<TResult> 返回类型

Task<TResult> 返回类型用于某种异步方法,此异步方法包含 return 语句,其中操作数是 TResult。

在下面的示例中,GetLeisureHoursAsync 方法包含返回整数的 return 语句。 该方法声明必须指定 Task<int> 的返回类型。 FromResult 异步方法是返回 DayOfWeek 的操作的占位符。

public static async Task ShowTodaysInfoAsync()
{string message =$"Today is {DateTime.Today:D}\n" +"Today's hours of leisure: " +$"{await GetLeisureHoursAsync()}";Console.WriteLine(message);
}static async Task<int> GetLeisureHoursAsync()
{DayOfWeek today = await Task.FromResult(DateTime.Now.DayOfWeek);int leisureHours =today is DayOfWeek.Saturday || today is DayOfWeek.Sunday? 16 : 5;return leisureHours;
}
// Example output:
//    Today is Wednesday, May 24, 2017
//    Today's hours of leisure: 5

在 ShowTodaysInfo 方法中从 await 表达式内调用 GetLeisureHoursAsync 时,await 表达式检索存储在由 GetLeisureHours 方法返回的任务中的整数值(leisureHours 的值)。 

通过从应用程序 await 中分离对 GetLeisureHoursAsync 的调用,可以更好地理解 await 如何从 Task<T> 检索结果,如以下代码所示。 对非立即等待的方法 GetLeisureHoursAsync 的调用返回 Task<int>,正如你从方法声明预料的一样。 该任务指派给示例中的 getLeisureHoursTask 变量。 因为 getLeisureHoursTask 是 Task<TResult>,所以它包含类型 TResult 的 Result 属性。 在这种情况下,TResult 表示整数类型。 await 应用于 getLeisureHoursTask,await 表达式的计算结果为 getLeisureHoursTask 的 Result 属性内容。 此值分配给 ret 变量。

Result 属性为阻止属性。 如果你在其任务完成之前尝试访问它,当前处于活动状态的线程将被阻止,直到任务完成且值为可用。 在大多数情况下,应通过使用 await 访问此值,而不是直接访问属性。

上一示例通过检索 Result 属性的值来阻止主线程,从而使 Main 方法可在应用程序结束之前将 message 输出到控制台。

var getLeisureHoursTask = GetLeisureHoursAsync();string message =$"Today is {DateTime.Today:D}\n" +"Today's hours of leisure: " +$"{await getLeisureHoursTask}";Console.WriteLine(message);

http://www.ppmy.cn/news/1549260.html

相关文章

使用 cnpm 安装 Electron,才是正确快速的方法

当然&#xff0c;下面是总结的几种安装 Electron 的方法&#xff0c;包括使用 npm 和 cnpm&#xff0c;以及一些常见的问题解决技巧。 ### 1. 使用 npm 安装 Electron #### 步骤 1: 初始化项目 在你的项目目录中初始化一个新的 Node.js 项目&#xff1a; bash npm init -y …

Makefile 之 自动化变量

作用范围只在这条规则以及连带规则中&#xff0c;所以其值也只在作用范围内有效。而不会影响规则链以外的全局变量的值。 "$" 表示目标的集合&#xff0c;就像一个数组&#xff0c;"$"依次取出目标&#xff0c;并执于命令。 "$<"和"$&qu…

TSmaster Measurement setup(测量设置)

文章目录 1、Measurement setup功能介绍2、数据流过滤3、Measurement Filter 测量过滤器3.1 插入过滤器3.2 设置过滤数据3.3 过滤条件的失能3.4 窗口缩放 1、Measurement setup功能介绍 Measurement setup 窗体主要包含三个功能&#xff1a; 提供一个面板&#xff0c;用户能够…

使用IDE实现java端远程调试功能

使用IDE实现java端远程调试功能 1. 整体描述2. 前期准备3. 具体操作3.1 修改启动命令3.2 IDE配置3.3 打断点3.4 运行Debug 4. 总结 1. 整体描述 在做项目时&#xff0c;有些时候&#xff0c;需要和第三方进行调式&#xff0c;但是第三方不在一起&#xff0c;需要进行远程调试&…

Java求职招聘网站开发实践

一、项目介绍 本文将介绍如何使用Java技术栈开发一个求职招聘网站。该网站主要实现求职者和招聘方的双向选择功能&#xff0c;包含用户管理、职位发布、简历投递等核心功能。 二、技术选型 后端框架&#xff1a;Spring Boot 2.7.0数据库&#xff1a;MySQL 8.0前端框架&#…

2025蓝桥杯(单片机)备赛--扩展外设之UART1的原理与应用(十二)

一、串口1的实现原理 a.查看STC15F2K60S2数据手册: 串口一在590页,此款单片机有两个串口。 串口1相关寄存器: SCON:串行控制寄存器(可位寻址) SCON寄存器说明: 需要PCON寄存器的SMOD0/PCON.6为0,使SM0和SM1一起指定工作模式,这里选择工作模式1,REN位置1,允许接受, …

3DEXPERIENCE软件是干什么的—3DE软件代理商微辰三维

在当今数字化转型浪潮席卷全球各个行业的大背景下&#xff0c;3DEXPERIENCE 软件宛如一颗璀璨的明星&#xff0c;闪耀在产品设计、制造以及协同创新等诸多领域。它是由达索系统公司推出的一款综合性的、功能强大的商业软件平台&#xff0c;为企业的整个产品生命周期管理带来了前…

爬虫重定向问题解决

一&#xff0c;问题 做爬虫时会遇到强制重定向的链接&#xff0c;此时可以手动获取重定向后的链接 如下图情况 第二个链接是目标要抓取的&#xff0c;但它是第一个链接重定向过去的&#xff0c;第一个链接接口状态也是302 二&#xff0c;解决方法 请求第一个链接&#xff0c…