测试代码:

  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. Codeforces 1566E Buds Re-hanging

    原题链接 Codeforces Global Round 16 E. Buds Re-hanging 首先想到,如果我们把一个\(buds\)挂到一个叶子上,那么会使得叶子总数减\(1\). 还有就是 ...

  2. .NET 8来了,那就开发一套基于.NET 8的快速开发框架吧,就叫Simple

    .NET 8来了,开发一套基于.NET 8的快速开发框架吧,就叫 Simple 点我Star 框架由来 为啥有了那么多开发框架,还得非要再搞个呢,大家都知道很多快速开发框架,啥ABP 啥水果啥的,怎么 ...

  3. Walrus 0.4发布:单一配置、多态运行,体验下一代应用交付模型

    今天,我们高兴地宣布云原生统一应用平台 Walrus 0.4 正式发布,这是一个里程碑式的版本更新.新版本采用了全新的应用模型--仅需进行单一配置,即可在多种模态的基础设施及环境中运行包括应用服务及周 ...

  4. ZooKeeper论文阅读笔记

    ZooKeeper论文传送门 介绍 ZooKeeper 是一个开源的分布式协调服务,它提供了高可用性和一致性的数据管理和协调功能.它被设计用于构建可靠的分布式系统,并提供了一组简单而强大的 wait- ...

  5. SSPRQ码型设计

    serdes速率超过50G之后,在VSR光模块场景下SSPRQ使用较为广泛.SSPRQ用于PAM4光模块眼图压力,闭合率测试. 但是有很多serdes IP不支持此功能.出于测试需要需要新设计SSPR ...

  6. springcloud+nacos项目启动后,登陆连接服务器时超时:Connection timed out no further information

    问题现象:项目启动后,登陆连接服务器时超时:Connection timed out no further information 192.168.42.190:4004 原因:我的配置有问题,在na ...

  7. [CF1844G] Tree Weights

    题目描述 You are given a tree with $ n $ nodes labelled $ 1,2,\dots,n $ . The $ i $ -th edge connects no ...

  8. NLP项目实战01--之电影评论分类

    介绍: 欢迎来到本篇文章!在这里,我们将探讨一个常见而重要的自然语言处理任务--文本分类.具体而言,我们将关注情感分析任务,即通过分析电影评论的情感来判断评论是正面的.负面的. 展示: 训练展示如下: ...

  9. Python实现贪吃蛇大作战

    贪吃蛇 初始版本 初始版本,只存在基本数据结构--双向队列. 游戏思路 贪吃蛇通过不断得吃食物来增长自身,如果贪吃蛇碰到边界或者自身则游戏失败. 食物是绿色矩形来模拟,坐标为随机数生成,定义一个蛇长变 ...

  10. Llama2-Chinese项目:5-推理加速

      随着大模型参数规模的不断增长,在有限的算力资源下,提升模型的推理速度逐渐变为一个重要的研究方向.常用的推理加速框架包含lmdeploy.FasterTransformer和vLLM等. 一.lmd ...