测试代码:

  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的更多相关文章

  1. 从一个简单的例子看spring ApplicationContext上下文隔离

    前言 某天,浏览博客园的时候,对首页上面的一篇文章,标题为:<<一个普通类就能干趴你的springboot,你信吗?>>,文章链接:https://www.cnblogs.co ...

  2. 8张图让你一步步看清 async/await 和 promise 的执行顺序

    摘要: 面试必问 原文:8张图帮你一步步看清 async/await 和 promise 的执行顺序 作者:ziwei3749 Fundebug经授权转载,版权归原作者所有. 为什么写这篇文章? 说实 ...

  3. 8 张图帮你一步步看清 async/await 和 promise 的执行顺序(转)

    https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651555491&idx=1&sn=73779f84c289d9 ...

  4. 跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击

    跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击 一.总结 一句话总结:比如用户留言功能,用户留言中写的是网页可执行代码,例如js代码,然后这段代码在可看到这段留言的不同一户的显示上就会 ...

  5. 通过一个示例形象地理解C# async await 非并行异步、并行异步、并行异步的并发量控制

    前言 接上一篇 通过一个示例形象地理解C# async await异步 我在 .NET与大数据 中吐槽前同事在双层循环体中(肯定是单线程了)频繁请求es,导致接口的总耗时很长.这不能怪前同事,确实难写 ...

  6. 一个简单的例子搞懂ES6之Promise

    ES5中实现异步的常见方式不外乎以下几种: 1. 回调函数 2. 事件驱动 2. 自定义事件(根本上原理同事件驱动相同) 而ES6中的Promise的出现就使得异步变得非常简单.promise中的异步 ...

  7. 一个简单的例子了解states

    在大规模的配置管理工作中,我们要编写大量的states.sls文件.top.sls是states系统的入口文件,它负责指定哪些设备调用哪些states.sls文件.statse的默认工作目录是在/sr ...

  8. Linux内核中的信号机制--一个简单的例子【转】

    本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123 ...

  9. 从一个简单的例子谈谈package与import机制

    转,原文:http://annie09.iteye.com/blog/469997 http://blog.csdn.net/gdsy/article/details/398072 这两篇我也不知道到 ...

  10. 用一个简单的例子来理解python高阶函数

    ============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...

随机推荐

  1. python的动态绑定属性和方法

    目录 创建类 动态绑定属性 动态绑定方法 创建类 首先我们创建一个类和它的对象 class Student: def __init__(self, name, age): self.name = na ...

  2. .NET周刊【11月第3期 2023-11-19】

    国内文章 .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试 https://www.cnblogs.com/FreeSql/p/17836 ...

  3. Object.assign () 和深拷贝

    先看看啥叫深拷贝?啥叫浅拷贝? 假设B复制了A,修改A的时候,看B是否发生变化: 如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值) 如果B没有改变,说明是深拷贝,自食其力!(修改堆 ...

  4. Centos8离线安装golang

    一.下载golang 1.下载安装包 2.下载后解压. tar -zxvf go1.17.linux-amd64.tar.gz 二.配置环境变量 vim /etc/profile 1.在环境变量最后添 ...

  5. 构建满足流批数据质量监控用火山引擎DataLeap

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 面对今日头条.抖音等不同产品线的复杂数据质量场景,火山引擎 DataLeap 数据质量平台如何满足多样的需求?本文 ...

  6. 两道题浅析PHP反序列化逃逸

    两道题浅析PHP反序列化逃逸 一.介绍 反序列化逃逸的出现是因为php反序列化函数在进行反序列化操作时,并不会审核字符串中的内容,所以我们可以操纵属性值,使得反序列化提前结束. 反序列化逃逸题一般都是 ...

  7. [ABC261E] Many Operations

    Problem Statement We have a variable \(X\) and \(N\) kinds of operations that change the value of \( ...

  8. TypeError: 'module' object is not callable (pytorch在进行MNIST数据集预览时出现的错误)

    在使用pytorch在对MNIST数据集进行预览时,出现了TypeError: 'module' object is not callable的错误: 上报错信息图如下: 从图中可以看出,报错位置为第 ...

  9. 关于windows激活程序的木马病毒分析及处置方法

    客户电脑中毒,锁定几个病毒进程.EDR杀毒.木马专杀工具无法处置,该现象是和深信服外网AF防火墙联动后发现的行为,EDR无感知. 该病毒特征为,每日早上用户开机,均检查到外链du.testjj.com ...

  10. Windows Server 2012 R2 远程桌面服务部署指南

    著作权归作者所有:来自51CTO博客作者mabofeng的原创作品,请联系作者获取转载授权,否则将追究法律责任 01-Windows Server 2012 R2 远程桌面服务部署指南文章来源:htt ...