【多线程】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 关键字
}

最新文章

  1. 安装angular-cli
  2. HTML CSS 特殊字符表(转载)
  3. ubuntu16.04 install flash
  4. truncate,delete,drop的异同点
  5. 06Java数组
  6. qsort函数详解
  7. Spring Project Annotations
  8. linux设备驱动归纳总结(八):2.总线、设备和驱动的关系【转】
  9. Rank List
  10. JavaScript基本概念(对象)
  11. Sharepoint 弹出消息提示框 .
  12. 转 由一次磁盘告警引发的血案:du 和 ls 的区别
  13. CLR类型设计之属性
  14. 将展示内容(div、iframe)放在Expand控件中
  15. c#使用资源文件完成国际化
  16. 关于NB-IoT的十大问题和答案【转】
  17. MySQL应用异常问题解决
  18. jquery中的$.each跳出循环并获取返回值
  19. HTTP、HTTPS
  20. CentOS7 logstash配置部署

热门文章

  1. python:常用模块一
  2. [19/03/24-星期日] 容器_Collection(集合、容器)之List(表,有顺序可重复)
  3. 【转】iOS的APP资源,开源的哦
  4. 线段拟合(带拉格朗日乘子,HGL)
  5. 二、IntelliJ IDEA 安装目录的核心文件讲解
  6. Redis-cluster详解
  7. 【TOJ 3005】Triangle(判断点是否在三角形内+卡精度)
  8. 【学时总结】◆学时·IX◆ 整体二分
  9. oracle的局部本地分区索引
  10. Co. - Microsoft - Windows - Tomcat、JDK、MySQL通过 Inno 集成为exe部署包