一个简单的例子看明白 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发送邮件, 写法大致如 ...
随机推荐
- L3-002 特殊堆栈
#include <bits/stdc++.h> using namespace std; const int N = 1E5 + 10; int tr[N]; stack<int& ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-31-JavaScript的调用执行-上篇
1.简介 在做web自动化时,有些情况playwright的api无法完成以及无法应对,需要通过或者借助第三方手段比如js来完成实现,比如:去改变某些元素对象的属性或者进行一些特殊的操作,本文讲解pl ...
- 在ASP.NET Core 中使用 .NET Aspire 消息传递组件
前言 云原生应用程序通常需要可扩展的消息传递解决方案,以提供消息队列.主题和订阅等功能..NET Aspire 组件简化了连接到各种消息传递提供程序(例如 Azure 服务总线)的过程.在本教程中,小 ...
- QT实战 之翻金币游戏
QT实战 之翻金币游戏 相较于原版的优化: 关卡数据不是用静态的config配置,而是动态生成,每次打开的关卡都生成不同的游戏数据,增加了可玩性: 关卡数据依据关卡等级的不同而生成不同难度的数据,随关 ...
- IDEA:自动生成方法注释并添加 @param 参数(Java+Kotlin)
在用 Java 或 Kotlin 编写方法时建议编写完善的注释,包含每个参数的意义和返回的内容,下面介绍在 IDEA 中自动生成方法注释的技巧. 第二张图按照图片填写就好了 ③(注意是*不是/*) * ...
- Oracle ADG容灾端部署Rman备份的一些实践经验
随着数据库中数据量的不断增加.业务的复杂性提高.各种政策颁布的系统容灾等级要求,数据库备份的工作及备份文件的有效性及备份文件的管理变得愈发重要.在Oracle数据库中提供了强大的备份和恢复工具,其中R ...
- Linux笔记02: Linux环境_2.3 Linux网络连接
2.3 Linux网络连接 本节介绍VMware Workstation Player 17下CentOS 7的网络连接. 2.3.1 VMware网络类型 VMware提供的网络连接有5种: ●桥接 ...
- C++ Qt开发:TreeWidget 树形选择组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TreeWid ...
- 使用Py2neo更新Neo4j中节点的属性值的正确姿势
1 def findNode(name, graph): 2 matcher = NodeMatcher(graph) 3 m = matcher.match(name = name).first() ...
- 【2020】装了VirtualBox后VMware Workstation无法使用SSH连接Centos的解决方法
装了个VirtualBox,然后发现无法使用Xshell远程Vmware中的centos了,一开始感觉是虚拟网卡冲突了,发现把VirtualBox的虚拟网卡禁用就可以使用,但是好麻烦啊??每次我特么要 ...