C# 使用多个异步方法

4df47dfa4c3522b4af2d1eb549656121.png

在一个异步方法中,可以调用一个或多个异步方法。如何编写代码,取决于一个异步方法的结果是否依靠于另一个异步方法。

01 按顺序调用异步方法

69d99e0b7e59e77047a8b064d2f876d0.png

使用 await 关键字可以调用每个异步方法。在有些情况下,如果一个异步方法依赖另一个异步方法的结果,await 关键字就非常有用。在这里,GreetingAsync 异步方法的第二次调用完全独立于其第一次调用的结果。这样,如果每个异步方法都不使用 await,那么整个 MultipleAsyncMethods 异步方法将更快地返回结果,如下所示:

private async static void MultipleAsyncMethods()
{string sl = await GreetingAsync("Stephanie"); string s2 = await GreetingAsync("Matthias");Console.WriteLine($"Finished both methods.{Environment.NewLine) " +$"Result 1: {s1}{Environment.NewLine} Result 2:{s2}");
}

02 使用组合器

7825e79db8268b23c3327b57c9fe4591.png

如果异步方法不依赖于其他异步方法,则每个异步方法都不使用 await,而是把每个异步方法的返回结果赋值给 Task 变量,就会运行得更快。GreetingAsync 方法返回 Task<string>。这些方法现在可以并行运行了。组合器可以帮助实现这一点。一个组合器可以接受多个同一类型的参数,并返回同一类型的值。多个同一类型的参数被组合成一个参数来传递。Task 组合器接受多个 Task 对象作为参数,并返回一个 Task。

示例代码调用 Task.WhenAll 组合器方法,它可以等待,直到两个任务都完成:

private async static void MultipleAsyncMethodsWithCombinators1()
{Task<string> tl = GreetingAsync("Stephanie");Task<string> t2 = GreetingAsync("Matthias"); await Task.WhenAll(t1, t2);Console.WriteLine($"Finished both methods.{Environment.NewLine) " +$"Result 1:{t1.Result}{Environment.NewLine} Result 2: {t2.Result}");
}

Task 类定义了 WhenAll 和 WhenAny 组合器。从 WhenAll 方法返回的 Task,是在所有传入方法的任务都完成了才会返回 Task。从 WhenAny 方法返回的 Task,是在其中一个传入方法的任务完成了就会返回 Task。

Task 类型的 WhenAll 方法定义了几个重载版本。如果所有的任务返回相同的类型,那么该类型的数组可用于 await 返回的结果。GreetingAsync 方法返回一个 Task<string>,等待返回的结果是一个字符串(string)形式。因此,Task.WhenAll 可用于返回一个字符串数组:

private async static void MultipleAsyncMethodsWithCombinators2()
{Task<string> t1 = GreetingAsync("Stephanie"); Task<string> t2 = GreetingAsync("Matthias"); string[] result = await Task.WhenAll(t1, t2);Console.WriteLine($"Finished both methods.{Environment.NewLine} " +$"Result 1:{result[0]}{Enviornment.NewLine} Result 2:{result[1]}");
}

只有等待的所有任务都完成时某个任务才能继续,WhenAll 方法就有实际用途。当调用任务在等待完成的任何任务都完成才能执行操作时,可以使用 WhenAny 方法。它可以使用任务的结果继续。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qqp2011java_腾讯开放平台中实现QQ登陆的功能

昨天为自己的网站实现了QQ登陆的功能,虽然,没有进行绑定,但是在技术层面上来说,已经了解了一点腾讯开放平台的协议.具体什么是OAUTH,请您GG一下吧...关于腾讯的开放平台,最主要的就是参数一定不能多,能有的要有,不能有的一定不能有.不然提交过去,就会提示什么什么错了.最关键的…

LeetCode之Longest Common Prefix

1、题目 Write a function to find the longest common prefix string amongst an array of strings2、代码实现 package leetcode.chenyu.test;public class LongestCommonPrefix {public static void main(String[] args) {String [] ss {"12345", "3234&qu…

51CTO各位博友大家好!

一直浏览51CTO的技术文章&#xff0c;感谢大家提供这么多的技术文章&#xff0c;今天下决心与大家共同交流。转载于:https://blog.51cto.com/tuidaohu/1414099

java遍历字典_Java中的HashMap遍历和C#的字典遍历

Dictionary list new Dictionary();list.Add("d", 1);//3.0以上版本foreach (var item in list){Console.WriteLine(item.Key item.Value);}//KeyValuePairforeach (KeyValuePair kv in list){Console.WriteLine(kv.Key kv.Value);}//通过键的集合取foreach (stri…

git 使用详解-- tag打标签

Git 的标签管理。跟大多数的 VCS 工具一样&#xff0c;git 也有在历史状态的关键点“贴标签”的功能&#xff0c;一般人们用这个功能来标记发布点&#xff08;例如’v1.0′&#xff09;。列出git中现有标签 要想列出git中现有的所有标签&#xff0c;输入’git tag’命令运行即可…

Nova虚拟机启动提示libvirtError

OpenStack自动化安装基本折腾完毕&#xff0c;装一次大概也就10分钟&#xff0c;但是装完后今天我的虚拟机起不来&#xff0c;经过查找log发 现如下图提示&#xff1a; 已经到这里&#xff0c;说明已经过了nova-sheduler那一关&#xff0c;跟踪一下代码&#xff0c;也正是在调用…

ASP.NET Core使用功能开关控制路由访问

前言在前面的文章&#xff0c;我们介绍了使用Middleware有条件地允许访问路由&#xff08;《ASP.NET Core使用Middleware有条件地允许访问路由》&#xff09;。而对于一些试验性的功能&#xff0c;我们并不希望用密码去控制是否允许访问&#xff0c;而是想用一种开关的方式开放…

LeetCode之Single Number

1、题目 Given an array of integers, every element appears twice except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? Subscribe to see which companies asked…

C#中的数组

欢迎您成为我的读者&#xff0c;希望这篇文章能给你一些帮助。前言前面的文章和大家一起看了C#中的异常&#xff0c;今天一起学习下C#中最基本的数据结构&#xff0c;数组的用法。数组实际上是由一个变量名称表示的一组同类型的数据元素。每个元素通过变量名称和一个或多个方括…

java怎么实现同步到微博功能_新浪微博信息站外同步的完整实现

最近遇到一个项目&#xff0c;其中需要将用户的微博信息与自己的网站项目上同步&#xff0c;好在新浪微博是提供了API的&#xff0c;大概查阅了一下&#xff0c;信息同步需要调用的是在关于授权机制说明中&#xff0c;新浪微博的API一共有两种验证机制&#xff0c;分别是&#…

33:计算分数加减表达式的值

33:计算分数加减表达式的值 查看提交统计提问总时间限制: 1000ms内存限制: 65536kB描述编写程序&#xff0c;输入n的值&#xff0c;求 1/1 - 1/2 1/3 - 1/4 1/5 - 1/6 1/7 - 1/8 ... (-1)n-11/n 的值。 输入输入一个正整数n。1 < n < 1000。输出输出一个实数&#x…

如何打卡后缀为3ds的文件

打开.3DS文件 3DS文件怎么打开&#xff1f; 用它吧&#xff1a;a3dsviewer&#xff0c;顾名思义&#xff0c;一个3D文件浏览工具&#xff0c;为用户提供一个快速和简单的3DS文件浏览器很容易。 这里是一些主要特点的“a3dsviewer”&#xff1a; 将3DS文件的POVRay格式。 输出的…

C/C++基本数据类型所占字节数

关于这个主要的问题&#xff0c;非常早曾经就非常清楚了&#xff0c;C标准中并没有详细给出规定那个基本类型应该是多少字节数&#xff0c;并且这个也与机器、OS、编译器有关&#xff0c;比方相同是在32bits的操作系统系&#xff0c;VC的编译器下int类型为占4个字节&#xff1b…

LeetCode之Find the Difference

1、题目 Given two strings s and t which consist of only lowercase letters. String t is generated by random shuffling string s and then add one more letter at a random position. Find the letter that was added in t. Example: Input: s "abcd" t &qu…

ASP.NET Core使用功能开关控制路由访问(续)

前言在前面的文章&#xff0c;我们介绍了使用功能开关控制路由访问。但其实我们使用了2个条件做的判断&#xff1a;var isDebugEndpoint context.Request.Path.Value.Contains("/test"); var debugEndpoint await _featureManager.IsEnabledAsync("ForbiddenD…

如何使用CDR智能填充工具

使用智能填充工具可以为任意的闭合区域填充颜色并设置轮廓。与其他填充工具不同&#xff0c;智能填充工具仅填充对象&#xff0c;它检测到区域的边缘并创建一个闭合路径&#xff0c;因此可以填充区域。例如&#xff0c;智能填充工具可以检测多个对象相交产生的闭合区域&#xf…

java对象引用出错_“Java有值传递和引用传递”为什么错了?

前言初学Java的时候&#xff0c;老师在课堂上说“Java有值传递和引用传递”&#xff0c;但网上“Java只有值传递”的呼声很高。本人在查找资料的过程中&#xff0c;在这两个说法之间反复横跳。经过本人的整理后&#xff0c;其实还真的是Java只有值传递。什么是值传递&#xff1…

试图加载格式不正确的程序

部署IIS的时候&#xff0c;会出现 System.BadImageFormatException: Could not load file or assembly xxx or one of its dependencies. 试图加载格式不正确的程序。 问题分析&#xff1a; 由于编译中有的是32位有的是64位 不一致 解决办法&#xff1a; 1.找到IIS该站点对应的…

LeetCode之Missing Number

1、题目 Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array. For example, Given nums [0, 1, 3] return 2. Given nums [0]return 12、代码实现 public class Solution {public int missingNumber(in…

Windows下卸载软件时提示 等待先前的卸载完成? 终止 dllhost.exe 进程

只要结束进程中的 “dllhost" 进程就好了。 估计原因是&#xff0c; 当卸载某些 "所谓的"较大型的软件的时候&#xff0c; 要去更新&#xff0c; 更改系统对dll链接库的注册&#xff0c; 更新。 通常这个过程等待的时间较长&#xff0c; 或者需要重新启动电脑才…