【多线程】 Task ,async ,await
【多线程】Task ,async ,await
一. WinForm 里经常会用到多线程, 多线程的好出就不多说了,来说说多线程比较麻烦的地方
1. UI 线程与其他线程的同步,主要是 Form 和 Control 在跨线程时的使用,这里是值得注意的,因为少有不甚就会出错。
二. 常用的跨线程方法
1. Invoke : 同步调用, 因为是同步操作,所以如果操作 UI 的方法很耗时,就不推荐了,得用 BeginInvoke。
代码:
private void button1_Click(object sender, EventArgs e)
{
Task.Run(() =>
{
string s = DoTask(); // 将耗时操作放到多线程里去做
Invoke(new Action(() => this.Text = s)); // 用 Invoke 来调用 UI 界面
});
} private static string DoTask() // 如果直接调用,是会阻塞 UI 线程的,需要多线程调用
{
Thread.Sleep( * ); // 模拟耗时操作
return "OK"; // 返回值
}
2. BeginInvoke (Invoke 的异步版本),用法与 Invoke 一致,只需把 Invoke 换成 BeginInvoke。
注意,并不是说异步的就一定好,异步需要考虑数据的同步, 异步你无法确认方法执行的顺序,则可能会出现无法预知的问题,而同步就没有这个问题了。
3. async ,await
1. 代码:与 上面的方法比起来,更简洁了,我喜欢。
private async void button1_Click(object sender, EventArgs e) //注意 async 关键字
{
this.Text = await Task.Run(() => DoTask());// 注意 await 关键字
}
【多线程】 Task ,async ,await的更多相关文章
- 多线程(5)async&await
.net 4.0的Task已经让我们可以非常简单地使用多线程,并且可以有返回值,也可以支持线程的取消等操作,可谓已经很强大了.但.net 4.5为我们带来了async&await,使得实现多线 ...
- 基于任务的异步编程(Task,async,await)
这节讲一下比较高级的异步编程用法Task,以及两个异步关键字async和await. Task是在C#5.0推出的语法,它是基于任务的异步编程语法,是对Thread的升级,也提供了很多API,先看一下 ...
- 多线程-Task、await/async
Task创建无返回值 Task是.netframwork4.0重新分装的多线程类.原因以前的多线程(thread threadpool)不好用.(.net framwork也是的发展的,现在的EF,刚 ...
- C#异步中的Task,async,await
class Program { static void Main(string[] args) { Console.WriteLine("我是主线程,线程ID:{0}", Thre ...
- Task async await
暇之余,究多Task.async.await. using System; using System.Collections.Generic; using System.Linq; using Sys ...
- 从Thread,ThreadPool,Task, 到async await 的基本使用方法解读
记得很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题 ...
- Thread,ThreadPool,Task, 到async await 的基本使用方法和理解
很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题吧. ...
- .Net 多线程 异步编程 Await、Async和Task
await和async简介 await和async是在C#5中引入,并且在.NetFramewor4.5以及.NetCore中进行了支持.主要是解决性能瓶颈,并且增强系统的响应能力. msdn关于 ...
- C#多线程和异步(二)——Task和async/await详解
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...
- C#多线程和异步(二)——Task和async/await详解(转载)
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...
随机推荐
- javaw.exe 和java.exe的区别
1.java启动的程序是命令行程序或阻塞程序,如果该程序未执行完毕或未被关闭,则所打开的命令行将被阻塞,不能执行其它命令如dir等,可以通过Ctrl+C等方式关闭程序:2.javaw启动的程序是窗口程 ...
- 安装配置MySQL
安装yum install mysql-server设置开机启动chkconfig mysqld on启动mysql服务器service mysqld start 设置root的初试密码mysqlad ...
- [转]这13个开源GIS软件,你了解几个?
这些开源GIS软件,你了解几个?本文内容部分来源于一份罗列了关于GIS软件应用的文章,笔者将其编译整合. 地理信息系统(Geographic Information System,GIS)软件依赖于覆 ...
- js正则判断日期
//****************************************************************************// Function ID : Commo ...
- .NET MVC伪静态
说明:MVC中的伪静态跟我们的WebForm里面的伪静态不一样(详情:配置伪静态(URL重写)) 由于我们的MVC中存在路由,所以我们不必去处理每个访问的页面进行重写,我们完全可以再配置一个路由让他显 ...
- JDBC连接数据库时错误提示的解决方案汇总
今天在连接JDBC时,出现了错误 最开始的URL是这样写的 Connection conn = DriverManager.getConnection("jdbc:mysql://local ...
- 记录一次LOB损坏导致的EXPDP导出ORA-01555报错
同事导出数据,结果遇到如下报错: expdp user1/XXXXXXXX directory=szdata1 dumpfile=szhzinfo_20180319.dmp logfile=szhzi ...
- onload函数不执行
原因: <jsp:include page="">通过该标签引入jsp时会导致<body>失效 案例: <jsp:include page=" ...
- 嵌入式:UCOSIII的使用(17.01.24补充)
0.一些移植.系统相关 OS_CFG_APP.H /* --------------------- MISCELLANEOUS ------------------ */ #define OS_CFG ...
- iOS | 地图定位
在IOS开发中,最常见的功能之一就是地图定位功能,不单单是百度地图,高德地图等专业的地图导航软件,还有美团,咕咚等一些美食购物类和运动类也需要这样的功能,所以学会这项技能是一名IOS开发工程师必须的. ...