C# async await 学习笔记2
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(); 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(); 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();
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";
}
}
}
C# async await 学习笔记2的更多相关文章
- async/await学习笔记
async/await 的目的是简化使用 promises 的写法. 让我们来看看下面的例子: // 一个标准的 JavaScript 函数 function getNumber1() { r ...
- C# async await 学习笔记1
由于我的开发工具为vs.net 2010(.net 4.0),需先做以下两步才能进行: 1.下载并安装Async CTP (http://www.microsoft.com/en-us/downloa ...
- Async/Await 学习与示例
参考:Async/await学习 es 7 提供了对 promise 对象的更好的操作,省去了很多丧心病狂的链式异步请求,promise 是回调地狱的福音,而 Async/Await 则是 promi ...
- C#同步,异步的理解,包括5.0中await和async(学习笔记)
之前在工作中一直用的是同步线程,就是先进入画面的load事件,然后在里面进行数据库调用的处理.后面又遇到了公司软件中一些比较古老的代码,一开始在那块古老代码中增加机能的时候,我想用到数据库的数据给画面 ...
- ES8之async/await学习随笔
详细学习参考文档: 阮一峰老师的博客,覆盖知识点ES6/7/8/9,本篇学习笔记对阮老师的关于async/await文档中的知识点进行分点总结 在ES8中加入async/await新特性后,很明显带来 ...
- async await 使用笔记
JavaScript的网络请求异步的,即网络请求不会阻塞当前 js 代码的继续执行,而是通过回调的方式,网络请求的代码块中注入回调函数,当网络请求完成,会触发相应的事件,通过触发事件来执行注册的回调函 ...
- C# .net async await 学习
async/await简单介绍 在处理比较耗时的操作(如图片处理.数据压缩.http请求等)传统的异步方法是直接使用Thread或者Task进行操作,在复杂的应用编写中可能会出现回调的问题,因此C#目 ...
- async和await学习笔记
结论: (1)asyc方法的返回类型必须为:void.Task或者Task<T>.返回类型为Task的异步方法中无需使用return返回值,而返回类型为Task<TResult> ...
- async 函数学习笔记
async函数就是Generator函数的语法糖. var fs = require('fs'); var readFile = function (fileName) { return new Pr ...
随机推荐
- nmap十条常用命令行格式
1) 获取远程主机的系统类型及开放端口 nmap -sS -P0 -sV -O <target> 这里的 < target > 可以是单一 IP, 或主机名,或域名,或子网 - ...
- 元素JS拖动的实现
涉及到了几个位置的属性 offset clientX cilentY 等 $(selector).on("mousedown",function (e){ var x = e. ...
- apache-jmeter学习文档
http://www.cnblogs.com/TankXiao/p/4045439.html#sampler
- 解决阿里云数据库RDS报错The table '/home/mysql/data3015/tmp/#sql_13975_23' is full
查询任何一条语句都显示 The table '/home/mysql/data3015/tmp/#sql_13975_23' is full 查看了下数据库利用磁盘空间没有满, 阿里云的处理方式: 1 ...
- 【转】awk、nawk、mawk、gawk的简答介绍
来自http://blog.sina.com.cn/s/blog_3d2d79aa0100h47h.html awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准 ...
- asp.net项目下的web service返回json数据问题
App_Code目录下放置WebService.cs文件,文件内容如: using System; using System.Collections.Generic; using System.Dat ...
- CodeForces 689C Mike and Chocolate Thieves (二分)
原题: Description Bad news came to Mike's village, some thieves stole a bunch of chocolates from the l ...
- c#中获取数组的行列个数的方法
GetUpperBound可以获取数组的最高下标.GetLowerBound可以获取数组的最低下标.这样就可以实现对数组的遍历//定义二维数组string[,] myStrArr2=new strin ...
- VMware下 Ubuntu 看不到共享文件夹之解决办法
VMware下 Ubuntu 看不到共享文件夹之解决办法 初学Linux,在VMWare 上装了Ubuntu10.04,主机端和虚拟机相互间的访问是必不可少的,途径有许多,其中vmware tool提 ...
- Diagramming for WinForms 的安装和配置
Diagramming for WinForms 是MindFusion公司推出的商业版通用流程图控件. 运行环境: WIN7 + .Net4.0 + Visual2010 试用版控件下载地址:htt ...