C#-等待异步函数执行结果-将调用异步方法的函数变成非异步执行
先来简单了解一下async、await
使用async await 的前提条件:需要C# 5.0以上版本 .NET Framework 4.5以上 Visual Studio 2012以上。
async是用来修饰方法,表示此方法可以是异步方法,如果方法里不包含await,则此方法相当于普通的同步方法。
await是使用在被async修饰的方法里。
await 后面跟上一个异步操作Task,当程序执行到此行代码时,由于有await的修饰,会等待异步操作Task执行,Task执行完成后才会执行此方法里await这一行后面的代码,
但是外部调用async方法的地方,不会等待Task完成,就执行后面的代码。
测试用例:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main function begin...CurrentThread ID:" + Thread.CurrentThread.ManagedThreadId.ToString());
Test();
Console.WriteLine("Main function end");
Console.ReadLine();
} public static async void Test()
{
Console.WriteLine("test begin...CurrentThread ID:" + Thread.CurrentThread.ManagedThreadId.ToString());
await Task.Run(()=>{ Work1(); });
await Task.Run(() => { Work2(); });
await Task.Run(() => { Work3(); });
Console.WriteLine("test end---");
} public static void Work1()
{
Console.WriteLine("Work1 start...CurrentThread ID:" + Thread.CurrentThread.ManagedThreadId.ToString());
Thread.Sleep(6000);
Console.WriteLine("Work1 end---");
} public static void Work2()
{
Console.WriteLine("Work2 start...CurrentThread ID:" + Thread.CurrentThread.ManagedThreadId.ToString());
Thread.Sleep(6000);
Console.WriteLine("Work2 end---");
} public static void Work3()
{
Console.WriteLine("Work3 start...CurrentThread ID:" + Thread.CurrentThread.ManagedThreadId.ToString());
Thread.Sleep(6000);
Console.WriteLine("Work3 end---");
}
}
测试结果展示

测试总结
从上面的结果可以看出,Test()是一个被async修饰的异步方法,方法内有三个await的Task,所以这三个Task会依次执行
而调用异步方法Test的Main函数,则在Test方法执行完之前就运行了Test()后面的语句
Console.WriteLine("Main function end");
无需等待Test()方法的结果
将调用异步方法的函数变成非异步执行
需要把调用的异步函数变为普通的执行顺序,即非异步执行顺序
只需要一句: Task.Run(async () => { await Test(); }).Wait();
var result = Task.Run(async() => await yourAsyncMethod()).Result;
对于没有返回值的异步函数:
Task.Run(async () => { await yourAsyncMethod(); }).Wait();
C#-等待异步函数执行结果-将调用异步方法的函数变成非异步执行的更多相关文章
- 一码阻塞,万码等待:ASP.NET Core 同步方法调用异步方法“死锁”的真相
在我们 2015 年开始的从 .NET Framework 向 .NET Core 迁移的工程中,遇到的最大的坑就是标题中所说的--同步方法中调用异步方法发生"死锁".虽然在 .N ...
- C#基础知识-函数的定义和调用(五)
函数也可以称为方法,可以很方便的把一些行为封装到函数里面,当调用这一函数时会把函数块里面的代码按照顺序执行,方法可以有多种形式,有无参数,有无返回值等. 1. 函数的定义 函数定义的基本格式: s ...
- 介绍了如何取成员函数的地址以及调用该地址:C++
摘要:介绍了如何取成员函数的地址以及调用该地址. 关键字:C++成员函数 this指针 调用约定 一.成员函数指针的用法 在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以视为一 ...
- C#调用Windows API函数截图
界面如下: 下面放了一个PictureBox 首先是声明函数: //这里是调用 Windows API函数来进行截图 //首先导入库文件 [System.Runtime.InteropServices ...
- c++纯虚函数在父类中调用的规避
构造和析构函数不允许调用纯虚函数,可以先调用虚函数,里面再调用纯虚函数实现. class Base{public: virtual void foo()=0; Base() { call_ ...
- 内联函数背景、例子、与普通函数的区别及要注意的地方 ------新标准c++程序设计
背景: 使用函数能够避免将相同代码重些多次的烦恼,还能减少可执行程序的体积,但也会带来程序运行时间上的开销.函数调用在执行时,首先在栈中为形参和局部变量分配存储空间,然后还要将实参的值复制给形参,接下 ...
- 序列化和反序列化,异步调用web/wcf/函数
//xml序列化 public static string Seria(DataSet ds) { XmlSerializer serializer = new XmlSerializer(typeo ...
- DLL与EXE之间的通讯调用 以及 回调函数的线程执行空间
dll 与 exe 之间的通讯方式有很多种, 本文采用回调函数的方法实现, 本文也将研究多线程,多模块的情况下,回调函数所在的线程, 啥也不说了,先附上代码: 下面的是dll模块的的, dll的工程文 ...
- 深入剖析php执行原理(4):函数的调用
本章开始研究php中函数的调用和执行,先来看函数调用语句是如何被编译的. 我们前面的章节弄明白了函数体会被编译生成哪些zend_op指令,本章会研究函数调用语句会生成哪些zend_op指,等后面的章节 ...
随机推荐
- linux设置系统环境变量的天坑
在设置系统环境变量,也就是 .bash_profile 或者 /etc/proflie 或者 .bashrc 中把path写错或者是把设置系统环境变量的格式写错! 会 导致 系统无法进入.登录无限循环 ...
- 基础3:js实现继承的多种方式
js实现继承的多种方式 1. 原型链继承 function Parent() { this.name = 'xwk' } Parent.prototype.getName = function() { ...
- 小技巧---eclipse 全选lib jar包
按住shift键,点击第一个jar包,然后点击最后一个jar包,就全选了所有jar包,然后添加build path 添加到类路径
- mybatis-plus 生成全套crud
pom依赖: <!-- web依赖--> <dependency> <groupId>org.springframework.boot</groupId> ...
- 轻量级消息队列 Django-Q 轻度体验
前言 最近做的这个项目(基于Django),需要做个功能,实现定时采集车辆定位. 这让我想起来几年前那个OneCat项目,当时我用的是Celery这个很重的组件 Celery实在是太重了,后来我做公众 ...
- Docker 搭建 Nexus3 私服 | 基本操作
1 Docker 安装 Nexus3 1.1 创建目录 在硬盘上创建 Nexus3 的主目录: mkdir -p /Users/yygnb/dockerMe/nexus3 为该目录添加权限: chmo ...
- Can't pickle local object '_createenviron.<locals>.encodekey'报错解决
关于selenium传参报错问题,用下面是报错信息: Traceback (most recent call last): File "D:/code/read_book/main.py&q ...
- centos7使用tar包安装mysql5.7
特别注意: 文档中涉及到密码的都是用的是弱密码,是存在安全风险的,一定要根据自己的情况修改为复杂度更高的密码! centos 7.6 mysql 5.7.31 基础目录: /srv/{app,data ...
- 若依(RuoYi )权限管理设计
前言 若依权限管理包含两个部分:菜单权限 和 数据权限.菜单权限控制着我们可以执行哪些操作.数据权限控制着我们可以看到哪些数据. 菜单是一个概括性名称,可以细分为目录.菜单和按钮,以若依自身为例: 目 ...
- Nginx反代服务器基础配置实践案例
转载自:https://www.bilibili.com/read/cv16149433?spm_id_from=333.999.0.0 方式1: 轮询 RR(默认轮询)每个请求按时间顺序逐一分配到不 ...