C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html)

提到了ThreadId是一样的,突然想到在WinForm中,非UI线程是无法直接更新UI线程上的控件的问题。

于是做了如下测试:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.Threading;namespace WindowsFormsApplication1
{public partial class Form1 : Form{public Form1(){InitializeComponent();}Task<string> LongTimeTask(){tbResult.Text += "LongTimeTask开始:" + DateTime.Now.ToString() + "\r\n";             Task<string> task = new Task<string>(() => { Thread.Sleep(5000); return "这是任务返回值"; });task.Start();tbResult.Text += "LongTimeTask结束:" + DateTime.Now.ToString() + "\r\n";    return task;}async void AsyncCall(){tbResult.Text += "AsyncCall开始:" + DateTime.Now.ToString() + "\r\n";     string result = await LongTimeTask(); //await调用的方法需要返回Task或Task<T>,且调用await所在的方法要有async关键字tbResult.Text += "AsyncCall:" + result + "\r\n"; tbResult.Text += "AsyncCall结束:" + DateTime.Now.ToString() + "\r\n"; }   private void button1_Click(object sender, EventArgs e){tbResult.Text += "Main开始:" + DateTime.Now.ToString() + "\r\n";AsyncCall();tbResult.Text += "Main结束:" + DateTime.Now.ToString() + "\r\n";}}
}

 发现,在AsyncCall中,可以直接访问TextBox(tbResult),如果对上面的测试觉得没什么奇怪,大家可以先看下面的代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace WindowsFormsApplication1
{public partial class Form2 : Form{public Form2(){InitializeComponent();}void LongTimeTask(){Thread.Sleep(5000);tbResult.Text += "AsyncCall结束:" + DateTime.Now.ToString() + "\r\n";} private void button1_Click(object sender, EventArgs e){tbResult.Text += "Main开始:" + DateTime.Now.ToString() + "\r\n";Thread t = new Thread(LongTimeTask);t.Start();tbResult.Text += "Main结束:" + DateTime.Now.ToString() + "\r\n";}}
}

运行到 LongTimeTask的tbResult.Text时,提示:线程间操作无效: 从不是创建控件“tbResult”的线程访问它。

为了能在非UI线程中访问到UI线程中的控件,于是需作如下修改:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace WindowsFormsApplication1
{public partial class Form2 : Form{delegate void UpdateUIDelegate();UpdateUIDelegate updateUIDelegate;        public Form2(){InitializeComponent();updateUIDelegate = new UpdateUIDelegate(UpdateUI);}void UpdateUI(){if (tbResult.InvokeRequired){tbResult.Invoke(updateUIDelegate);}else{tbResult.Text += "AsyncCall结束:" + DateTime.Now.ToString() + "\r\n";}}void LongTimeTask(){Thread.Sleep(5000);UpdateUI();        } private void button1_Click(object sender, EventArgs e){tbResult.Text += "Main开始:" + DateTime.Now.ToString() + "\r\n";Thread t = new Thread(LongTimeTask);t.Start();tbResult.Text += "Main结束:" + DateTime.Now.ToString() + "\r\n";}}
}

转载于:https://www.cnblogs.com/siso/p/3691494.html

C# async await 学习笔记2相关推荐

  1. C# async await 学习笔记1

    由于我的开发工具为vs.net 2010(.net 4.0),需先做以下两步才能进行: 1.下载并安装Async CTP (http://www.microsoft.com/en-us/downloa ...

  2. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记--async和await(一) 接上文 多线程编程学习笔记--async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  3. angular2 学习笔记 ( Rxjs, Promise, Async/Await 的区别 )

    Promise 是 ES 6 Async/Await 是 ES 7 Rxjs 是一个 js 库 在使用 angular 时,你会经常看见这 3 个东西. 它们都和异步编程有关,有些情况下你会觉得用它们 ...

  4. ES6学习笔记(十六)async函数

    1.含义 ES2017 标准引入了 async 函数,使得异步操作变得更加方便. async 函数是什么?一句话,它就是 Generator 函数的语法糖,号称异步的终极解决方案. 前文有一个 Gen ...

  5. Promise/async awit/fetch 学习笔记

    Promise 一.Promise 1.then()方法 2.catch()方法 3.finally()方法(实际开发中并不常用) 4.Promise.resolve()和Promise.reject ...

  6. ASP.NET Core 2 学习笔记(七)路由

    ASP.NET Core通过路由(Routing)设定,将定义的URL规则找到相对应行为:当使用者Request的URL满足特定规则条件时,则自动对应到相符合的行为处理.从ASP.NET就已经存在的架 ...

  7. DAY7-Python学习笔记

    前记: 这几天在弄小程序,view页面的开发很简单,但是在加载图片上遇到了问题,小程序的大小不能超过2M,所以大部分的图片内容要通过request请求服务器来获取,这里之前学习小程序的时候是通过网站A ...

  8. Windows phone 8 学习笔记(8) 定位地图导航

    Windows phone 8 学习笔记(8) 定位地图导航 原文:Windows phone 8 学习笔记(8) 定位地图导航 Windows phone 8 已经不使用自家的bing地图,新地图控 ...

  9. ASP.NET Core 2 学习笔记(三)中间件

    原文:ASP.NET Core 2 学习笔记(三)中间件 之前ASP.NET中使用的HTTP Modules及HTTP Handlers,在ASP.NET Core中已不复存在,取而代之的是Middl ...

最新文章

  1. [LeetCode-JAVA] Reverse Nodes in k-Group
  2. BootStrap学习(6)_模态框
  3. C++和C语言函数相互调用
  4. java8 lambda maplist排序_「java8系列」流式编程Stream
  5. 7-250 最长对称子串 (25 分)
  6. Cilium架构:提供并透明地保护应用程序工作负载之间的网络连接和负载平衡
  7. 解决ajax中文乱码问题
  8. Improving Transferability of Adversarial Examples with Input Diversity论文解读
  9. Java中集合List,Map和Set的差别
  10. 共享打印机服务器脱机状态,网络/局域网共享打印机脱机故障处理方法
  11. 新手gxf学python---万年历
  12. oracle对时间范围比较的语句
  13. [干货][互联网]备战春招秋招的经验分享
  14. RS485通信学习笔记
  15. python中科学记数法表示_matplotlib中的科学记数法
  16. 计算机科学与技术学校学科评估,计算机科学与技术学科评估具体排名「大学专业排名」...
  17. C++各大有名库的介绍(一)
  18. 对于算法工程师职业生涯规划的考虑
  19. ValidFrom验证控件
  20. 牛客练习赛33 - ABCD

热门文章

  1. java中separator_java - File.separator和路径中的斜杠之间的区别
  2. 武汉大学计算机学院放假时间,计算机学院关于2019年学生放暑假的通知
  3. php-cgi 重启,自动监测和重启 FastCGI 服务
  4. python中的随机函数怎么用_Python中随机数的使用方法有那些?
  5. mysql 附近3公里的_mysql搜寻附近N公里内数据的实例
  6. 女士细线毛衣起多少针_潇洒帅气的男童V领开襟毛衣编织,带教程图解
  7. android 停用应用的命令,免Root使用ADB命令_停用手机系统应用
  8. mysql 8.0 docker_Docker安装MySQL8.0的实现方法
  9. 图像分割:Python的SLIC超像素分割
  10. 深入理解 wpa_supplicant(一)