c#5.0(.net 4.5之后)的 Async+await+Task的异步机制的调试笔记
1.)无返回值的情况(异步也是基于线程).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace ConfigLab.Test.BLL.AsyncTaskSpace
{
/// <summary>
/// 功能简介:测试无返回值,无需等待的async+await+task的异步处理机制。
/// 创建时间:2020-8-21
/// 创建人:pcw
/// 博客:http://cnblogs.com/taohuadaozhu
/// </summary>
public class Test1_Async_NotWait
{
public static void StartTest()
{
Utils.SaveLog($"Test1_Async_NotWait.StartTest.开始..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},线程:{Thread.CurrentThread.ManagedThreadId}");
AsyncTestMethod();
Utils.SaveLog($"Test1_Async_NotWait.StartTest.结束..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},线程:{Thread.CurrentThread.ManagedThreadId}");
}
/// <summary>
/// 异步方法
/// </summary>
/// <returns></returns>
static async Task AsyncTestMethod()
{
/*
注1:使用await表达式时,方法到这里之前先返回,等控制返回到调用此方法的线程中后,控制会自动返回到await关联语句下面的语句中。发生异常时,异常会在await表达式中抛出
注2: 使用Task.Run方式执行异步时,会在独立的线程中执行异步任务。
*/
Utils.SaveLog($"Test1_Async_NotWait.AsyncTestMethod.begin: await Task.Run,线程:{Thread.CurrentThread.ManagedThreadId}");
await Task.Run(() => {
for (int i = 0; i < 5; i++)
{
Thread.Sleep(200);
Utils.SaveLog($"Test1_Async_NotWait.AsyncTestMethod:{i},{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},线程:{Thread.CurrentThread.ManagedThreadId}");
}
});
Utils.SaveLog($"Test1_Async_NotWait.AsyncTestMethod.after: await Task.Run,线程:{Thread.CurrentThread.ManagedThreadId}");
}
}
}
<执行结果>
[2020-08-21 00:41:33]Test1_Async_NotWait.StartTest.开始..2020-08-21 00:41:33 742,线程:1
[2020-08-21 00:41:33]Test1_Async_NotWait.AsyncTestMethod.begin: await Task.Run,线程:1
[2020-08-21 00:41:33]Test1_Async_NotWait.StartTest.结束..2020-08-21 00:41:33 815,线程:1
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod:0,2020-08-21 00:41:34 017,线程:3
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod:1,2020-08-21 00:41:34 219,线程:3
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod:2,2020-08-21 00:41:34 422,线程:3
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod:3,2020-08-21 00:41:34 624,线程:3
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod:4,2020-08-21 00:41:34 827,线程:3
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod.after: await Task.Run,线程:1
2.)有返回值的情况(异步也是基于线程).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace ConfigLab.Test.BLL.AsyncTaskSpace
{
/// <summary>
/// 功能简介:测试有返回值,无需等待的async+await+task的异步处理机制。
/// 创建时间:2020-8-21
/// 创建人:pcw
/// 博客:http://cnblogs.com/taohuadaozhu
/// </summary>
public class Test3_Async_TaskWithReturn
{
public static void StartTest()
{
Utils.SaveLog($"Test3_Async_TaskWithReturn.StartTest.开始..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},线程:{Thread.CurrentThread.ManagedThreadId}");
getTestMethodReturnValue();
Utils.SaveLog($"Test3_Async_TaskWithReturn.StartTest.结束..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")}");
}
static async void getTestMethodReturnValue()
{
Utils.SaveLog($"Test3_Async_TaskWithReturn.getTestMethodReturnValue.开始..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},线程:{Thread.CurrentThread.ManagedThreadId}");
var taskResult= AsyncTestMethod();
await taskResult;
//Utils.SaveLog($"Test3_Async_TaskWithReturn.StartTest.结束..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},异步任务返回结果:{(task.Status!=TaskStatus.WaitingForActivation? task.Result:"")}");
Utils.SaveLog($"Test3_Async_TaskWithReturn.getTestMethodReturnValue.结束..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},异步任务返回结果:{taskResult.Result},线程:{Thread.CurrentThread.ManagedThreadId}");
} /// <summary>
/// 异步方法
/// </summary>
/// <returns></returns>
static async Task<string> AsyncTestMethod()
{
/*
注1:使用await表达式时,控制会返回到调用此方法的线程中;在await等待的方法执行完毕后,控制会自动返回到下面的语句中。发生异常时,异常会在await表达式中抛出
注2: 使用Task.Run方式执行异步时,会在独立的线程中执行异步任务。
*/
Utils.SaveLog($"Test3_Async_TaskWithReturn.AsyncTestMethod..(await Task.Run之前),线程:{Thread.CurrentThread.ManagedThreadId}");
return await Task.Run(() => {
Thread.Sleep(2000);
Utils.SaveLog($"Test3_Async_TaskWithReturn.AsyncTestMethod(task.Run之中),{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},线程:{Thread.CurrentThread.ManagedThreadId}");
return "success";
});
}
}
}
<执行结果>
[2020-08-21 00:41:35]Test3_Async_TaskWithReturn.StartTest.开始..2020-08-21 00:41:35 821,线程:1
[2020-08-21 00:41:35]Test3_Async_TaskWithReturn.getTestMethodReturnValue.开始..2020-08-21 00:41:35 824,线程:1
[2020-08-21 00:41:35]Test3_Async_TaskWithReturn.AsyncTestMethod..(await Task.Run之前),线程:1
[2020-08-21 00:41:35]Test3_Async_TaskWithReturn.StartTest.结束..2020-08-21 00:41:35 829
[2020-08-21 00:41:37]Test3_Async_TaskWithReturn.AsyncTestMethod(task.Run之中),2020-08-21 00:41:37 830,线程:3
[2020-08-21 00:41:37]Test3_Async_TaskWithReturn.getTestMethodReturnValue.结束..2020-08-21 00:41:37 834,异步任务返回结果:success,线程:1
c#5.0(.net 4.5之后)的 Async+await+Task的异步机制的调试笔记的更多相关文章
- [C#] .NET4.0中使用4.5中的 async/await 功能实现异步
在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framework 4.0中却无法使用.这时不免面临着抉择,到底是升级整个解决方案还是不使用呢? 如果你的软件还没发布出去 ...
- .NET4.0中使用4.5中的 async/await 功能实现异步
在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framework 4.0中却无法使用.这时不免面临着抉择,到底是升级整个解决方案还是不使用呢? 如果你的软件还没发布出去 ...
- 如何在.net4.0中使用.net4.5的async/await
推荐文章: http://www.cnblogs.com/hj4444/p/3857771.html http://www.cnblogs.com/dozer/archive/2012/03/06/a ...
- [C#] .NET4.0中使用4.5中的 async/await 功能实现异
好东西需要分享 原文出自:http://www.itnose.net/detail/6091186.html 在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framew ...
- 结合源码看nginx-1.4.0之nginx异步机制详解
目录 0. 摘要 1. nginx异步设计思想 2. nginx异步设计数据结构 3. nginx异步机制源码解析 4. 一个简单的应用异步例子 5. 小结 6. 参考源码
- ArcGIS API for JavaScript 4.2学习笔记[0] AJS4.2概述、新特性、未来产品线计划与AJS笔记目录
放着好好的成熟的AJS 3.19不学,为什么要去碰乳臭未干的AJS 4.2? 4.2全线基础学习请点击[直达] 4.3及更高版本的补充学习请关注我的博客. ArcGIS API for JavaScr ...
- C#Framework4.0支持异步async/await语法
由于用户使用的是XP系统,但是程序里异步都是通过async/await代码来实现的,然而async/await需要Framework4.5版本才可以,而XP系统最高只能支持到Framework4.0, ...
- Python的异步编程[0] -> 协程[1] -> 使用协程建立自己的异步非阻塞模型
使用协程建立自己的异步非阻塞模型 接下来例子中,将使用纯粹的Python编码搭建一个异步模型,相当于自己构建的一个asyncio模块,这也许能对asyncio模块底层实现的理解有更大的帮助.主要参考为 ...
- Python的异步编程[0] -> 协程[0] -> 协程和 async / await
协程 / Coroutine 目录 生产者消费者模型 从生成器到异步协程– async/await 协程是在一个线程执行过程中可以在一个子程序的预定或者随机位置中断,然后转而执行别的子程序,在适当的时 ...
- tornado5.0+async+await
不使用数据库的情况下实现异步 使用gen.sleep()模拟阻塞 使用gen.sleep(time) 而不是time.sleep(),time.sleep()阻塞整个进程,看gen.sleep()源码 ...
随机推荐
- virtualbox的Linux虚拟磁盘大小调整及注意事项
virtualBox 调整磁盘分区 起因 起初安装centos6.3 时,没有修改默认的硬盘空间.只有8G,导致后面安装完zookeeper,jdk之后,在安装mysql发现磁盘空间不足 扩容步骤 1 ...
- Pytest进阶使用
fixture 特点: 命令灵活:对于setup,teardown可以省略 数据共享:在conftest.py配置里写方法可以实现数据共享,不需要import导入,可以跨文件共享 scope的层次及神 ...
- Annocation(注解)的使用示例
示例一:生成文档相关的注解示例二:在编译时进行格式检查(JDK内置的三个基本注解)@Override: 限定重写父类方法, 该注解只能用于方法@Deprecated: 用于表示所修饰的元素(类, 方法 ...
- 集训队互测2016Unknown(UOJ191)
题目链接 前面部分和lzz的题解是一样的. 首先将输入点(x,y)变为(-y,x)然后,只需找一个向量与(-y,x)的点积最大,即找一个向量在(-y,x)上的投影最长.此时所有的点都是在x轴上方的,容 ...
- surging 将推出社区版微服务平台
前言 对于.NET大家并不陌生,有大批的企业选择.NET作为公司构建多种应用的开发平台,但是近几年随着微服务,大数据,移动端,物联网兴起,而后.NET社区生态没有跟上时代的步伐,已开始趋于没落,而其中 ...
- winscp报错Server sent passive reply with unroutable address. Using server address instead
找了一堆没用. 最后终于 1.使用winSCP连接ftp时,编辑会话,单击高级. 2.进入高级设置之后,单击连接,查看连接模式,把被动模式的勾,勾掉. 3.单击确定,然后保存配置,重新连接FTP,OK
- 文本转语音TTS(文本阅读和视频配音制作)MP3
DL-TTS 通过AI驱动引擎可将文本转化为逼真的语音,它可以:(1)生成逼真的合成语音实现与人声的语调和情感匹配的流畅.发音自然的文本转语音.(2)细化的文本转语音控制支持多种语言,并可调整语速.语 ...
- Spring事务传播行为实战
一.什么是事务传播行为? 事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何运行. 例如:methodA方法调用methodB方 ...
- JSP Webshell免杀设计
JSP Webshell免杀设计 @author:drag0nf1y 介绍 什么是Webshell? 被服务端解析执行的php.jsp文件 什么是RCE? remote command execute ...
- 谷歌拼音输入法扩展API开发指南
为了帮助开发者在谷歌拼音输入法的基本输入功能基础上,开发和定义更丰富的扩展输入功能,谷歌拼音输入法提供了以Lua脚本编程语言为基础的输入法扩展API.利用输入法扩展API,开发者可以编写自定义的输入功 ...