一个简单的例子看明白 async await Task
测试代码:
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Threading;
9 using System.Threading.Tasks;
10 using System.Windows.Forms;
11 using Utils;
12
13 namespace test
14 {
15 public partial class Form1 : Form
16 {
17 public Form1()
18 {
19 InitializeComponent();
20 }
21
22 private void Form1_Load(object sender, EventArgs e)
23 {
24
25 }
26
27 /// <summary>
28 /// 执行任务
29 /// </summary>
30 public string DoWork(string str)
31 {
32 Thread.Sleep(3000); //模拟延迟 比如网络请求 用了3000毫秒
33 return "输出:" + str;
34 }
35
36 /// <summary>
37 /// 执行任务
38 /// </summary>
39 public Task<string> DoWorkByTask(string str)
40 {
41 return Task.Run(() =>
42 {
43 Thread.Sleep(3000); //模拟延迟 比如网络请求 用了3000毫秒
44 return "输出:" + str;
45 });
46 }
47
48 /// <summary>
49 /// 测试1
50 /// </summary>
51 private async void button1_Click(object sender, EventArgs e)
52 {
53 LogTimeUtil logTime = new LogTimeUtil();
54
55 var t1 = DoWorkByTask("测试值1");
56
57 var t2 = DoWorkByTask("测试值2");
58
59 string r1 = await t1;
60
61 textBox1.AppendText(r1 + "\r\n");
62
63 string r2 = await t2;
64
65 textBox1.AppendText(r2 + "\r\n");
66
67 logTime.LogTime("耗时", textBox1);
68 }
69
70 /// <summary>
71 /// 测试2
72 ///
73 /// 等效于 测试1
74 /// </summary>
75 private void button2_Click(object sender, EventArgs e)
76 {
77 Task.Run(() => //如果不加Task.Run,界面会卡
78 {
79 LogTimeUtil logTime = new LogTimeUtil();
80
81 Task<string> t1 = Task.Run<string>(() => { return DoWork("测试值1"); });
82 Task<string> t2 = Task.Run<string>(() => { return DoWork("测试值2"); });
83
84 Task.WaitAll(t1, t2);
85
86 this.Invoke(new Action(() => //线程中修改控件数据要使用Invoke
87 {
88 textBox1.AppendText(t1.Result + "\r\n");
89 textBox1.AppendText(t2.Result + "\r\n");
90 }));
91
92 logTime.LogTime("耗时", textBox1);
93 });
94 }
95
96 /// <summary>
97 /// 测试3
98 /// </summary>
99 private async void button3_Click(object sender, EventArgs e)
100 {
101 LogTimeUtil logTime = new LogTimeUtil();
102
103 var r1 = await DoWorkByTask("测试值1");
104
105 textBox1.AppendText(r1 + "\r\n");
106
107 var r2 = await DoWorkByTask("测试值2");
108
109 textBox1.AppendText(r2 + "\r\n");
110
111 logTime.LogTime("耗时", textBox1);
112 }
113
114 /// <summary>
115 /// 测试4
116 ///
117 /// 等效于 测试3
118 /// </summary>
119 private void button4_Click(object sender, EventArgs e)
120 {
121 Task.Run(() => //如果不加Task.Run,界面会卡
122 {
123 LogTimeUtil logTime = new LogTimeUtil();
124
125 Task<string> t1 = Task.Run<string>(() => { return DoWork("测试值1"); });
126 t1.Wait();
127 this.Invoke(new Action(() => //线程中修改控件数据要使用Invoke
128 {
129 textBox1.AppendText(t1.Result + "\r\n");
130 }));
131
132 Task<string> t2 = Task.Run<string>(() => { return DoWork("测试值2"); });
133 t2.Wait();
134 this.Invoke(new Action(() => //线程中修改控件数据要使用Invoke
135 {
136 textBox1.AppendText(t2.Result + "\r\n");
137 }));
138
139 logTime.LogTime("耗时", textBox1);
140 });
141 }
142
143 }
144 }
测试输出:

附 LogTimeUtil.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace Utils
{
/// <summary>
/// 记录耗时
/// </summary>
public class LogTimeUtil
{
private DateTime _lastTime; public LogTimeUtil()
{
_lastTime = DateTime.Now;
} /// <summary>
/// 记录耗时
/// </summary>
public void LogTime(string msg)
{
double d = DateTime.Now.Subtract(_lastTime).TotalSeconds;
LogUtil.Log(msg + ",耗时:" + d.ToString("0.000") + " 秒");
} /// <summary>
/// 记录耗时
/// </summary>
public void LogTime(string msg, TextBox txt)
{
double d = DateTime.Now.Subtract(_lastTime).TotalSeconds;
msg = msg + ",耗时:" + d.ToString("0.000") + " 秒\r\n";
if (txt.InvokeRequired)
{
txt.Invoke(new Action(() =>
{
txt.AppendText(msg);
}));
}
else
{
txt.AppendText(msg);
}
}
}
}
一个简单的例子看明白 async await Task的更多相关文章
- 从一个简单的例子看spring ApplicationContext上下文隔离
前言 某天,浏览博客园的时候,对首页上面的一篇文章,标题为:<<一个普通类就能干趴你的springboot,你信吗?>>,文章链接:https://www.cnblogs.co ...
- 8张图让你一步步看清 async/await 和 promise 的执行顺序
摘要: 面试必问 原文:8张图帮你一步步看清 async/await 和 promise 的执行顺序 作者:ziwei3749 Fundebug经授权转载,版权归原作者所有. 为什么写这篇文章? 说实 ...
- 8 张图帮你一步步看清 async/await 和 promise 的执行顺序(转)
https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651555491&idx=1&sn=73779f84c289d9 ...
- 跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击
跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击 一.总结 一句话总结:比如用户留言功能,用户留言中写的是网页可执行代码,例如js代码,然后这段代码在可看到这段留言的不同一户的显示上就会 ...
- 通过一个示例形象地理解C# async await 非并行异步、并行异步、并行异步的并发量控制
前言 接上一篇 通过一个示例形象地理解C# async await异步 我在 .NET与大数据 中吐槽前同事在双层循环体中(肯定是单线程了)频繁请求es,导致接口的总耗时很长.这不能怪前同事,确实难写 ...
- 一个简单的例子搞懂ES6之Promise
ES5中实现异步的常见方式不外乎以下几种: 1. 回调函数 2. 事件驱动 2. 自定义事件(根本上原理同事件驱动相同) 而ES6中的Promise的出现就使得异步变得非常简单.promise中的异步 ...
- 一个简单的例子了解states
在大规模的配置管理工作中,我们要编写大量的states.sls文件.top.sls是states系统的入口文件,它负责指定哪些设备调用哪些states.sls文件.statse的默认工作目录是在/sr ...
- Linux内核中的信号机制--一个简单的例子【转】
本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123 ...
- 从一个简单的例子谈谈package与import机制
转,原文:http://annie09.iteye.com/blog/469997 http://blog.csdn.net/gdsy/article/details/398072 这两篇我也不知道到 ...
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
随机推荐
- MAUI Blazor 如何通过url使用本地文件
前言 上一篇文章 MAUI Blazor 显示本地图片的新思路 中, 提出了通过webview拦截,从而在前端中显示本地图片的思路.不过当时还不完善,随后也发现了很多问题.比如, 不同平台上的url不 ...
- Centos8.4离线安装JDK+Tomcat+MySQL8.0+Nginx
一.安装JDK 注:以下命令环境在Xshell中进行. 1.查询出系统自带的OpenJDK及版本 rpm -qa | grep jdk 2.如果显示已安装openjdk则对其进行卸载. 输入:rpm ...
- Web前端工程的装机必备软件
前言 最近作者的电脑 C 盘变红了,这让我很难受(有点小强迫症),所以准备重新安装下系统,顺便把 C 盘扩大点. 注意: 操作系统是 windows 11 23H2. 所有的命令行都是使用 Windo ...
- 文心一言 VS 讯飞星火 VS chatgpt (155)-- 算法导论12.3 2题
二.用go语言,假设通过反复向一棵树中插人互不相同的关键字来构造一棵二叉搜索树.证明:在这棵树中查找关键字所检查过的结点数目等于先前插入这个关键字所检查的结点数目加 1. 文心一言: 为了证明这个结论 ...
- ubuntu20.04安装goaccess实时对nginx日志进行分析
ubuntu20.04安装goaccess实时对nginx日志进行分析 goaccess可以对nginx日志进行分析,生成实时动态页面,同时通过nginx反向代理来解决WebSocket数据传输问题. ...
- POJ1006、hdu1370
思路:中国剩余定理.纯粹的用暴力求逆元. 1 #include<iostream> 2 #include<string.h> 3 #include<string> ...
- Swagger配置类
Swagger配置类 package com.guoba.servicebase.config; import com.google.common.base.Predicates; import or ...
- springboot--ActiveMQ--消息队列
ActiveMQ远程消息队列 一.我们创建springboot项目工程 二.创建完毕我们简单介绍 activeMQ 1.概述 消息中间件可以理解成就是一个服务软件,保存信息的容器,比如生活中的快递云柜 ...
- K8s和声明式编程
转载:原文链接 认识k8s之后,他的操作模式对我来说是一种很不错的体验.他提供了更接近现实世界的面向对象接口. 什么是k8s? Kubernetes(K8s)是一种开源容器编排平台,用于自动化部署.扩 ...
- tty详解
linux下tty命令详解 [功能] 打印连接到标准输入的终端的文件名. [描述] 命令项: -s, --silent, --quiet: 什么也不打印,只是返回退出状态码. --help: 打印帮助 ...