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的更多相关文章

  1. async/await学习笔记

    async/await 的目的是简化使用 promises 的写法.     让我们来看看下面的例子: // 一个标准的 JavaScript 函数 function getNumber1() { r ...

  2. C# async await 学习笔记1

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

  3. Async/Await 学习与示例

    参考:Async/await学习 es 7 提供了对 promise 对象的更好的操作,省去了很多丧心病狂的链式异步请求,promise 是回调地狱的福音,而 Async/Await 则是 promi ...

  4. C#同步,异步的理解,包括5.0中await和async(学习笔记)

    之前在工作中一直用的是同步线程,就是先进入画面的load事件,然后在里面进行数据库调用的处理.后面又遇到了公司软件中一些比较古老的代码,一开始在那块古老代码中增加机能的时候,我想用到数据库的数据给画面 ...

  5. ES8之async/await学习随笔

    详细学习参考文档: 阮一峰老师的博客,覆盖知识点ES6/7/8/9,本篇学习笔记对阮老师的关于async/await文档中的知识点进行分点总结 在ES8中加入async/await新特性后,很明显带来 ...

  6. async await 使用笔记

    JavaScript的网络请求异步的,即网络请求不会阻塞当前 js 代码的继续执行,而是通过回调的方式,网络请求的代码块中注入回调函数,当网络请求完成,会触发相应的事件,通过触发事件来执行注册的回调函 ...

  7. C# .net async await 学习

    async/await简单介绍 在处理比较耗时的操作(如图片处理.数据压缩.http请求等)传统的异步方法是直接使用Thread或者Task进行操作,在复杂的应用编写中可能会出现回调的问题,因此C#目 ...

  8. async和await学习笔记

    结论: (1)asyc方法的返回类型必须为:void.Task或者Task<T>.返回类型为Task的异步方法中无需使用return返回值,而返回类型为Task<TResult> ...

  9. async 函数学习笔记

    async函数就是Generator函数的语法糖. var fs = require('fs'); var readFile = function (fileName) { return new Pr ...

随机推荐

  1. 剑指Offer:面试题26——复制复杂的链表(java实现)

    问题描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 思路1: 1.先复制链表节点,并用next链接起来. 2.然后对每一个结点去修改 ...

  2. 异常:Message 850 not found; No message file for product=network, facility=NL解决方案

    一.异常信息:   Message 850 not found; No message file for product=network, facility=NL    二.解决方案:     后来在 ...

  3. asp.net中选择数字时,另外的数字同时发生变化(适用dev控件)

      关键: <ClientSideEvents ValueChanged="AgioChanged" />   <div class="col-sm-4 ...

  4. MFC使用TRACKMOUSEEVENT触发mouseHover和mouseLeave

    为对话框添加WM_MOUSEHOVER或WM_MOUSELEAVE消息并不会响应.MFC需要特殊处理,其中一法就是使用TRACKMOUSEEVENT void CmfcDlgDlg::OnMouseM ...

  5. 二十六:Struts2 和 spring整合

    二十六:Struts2 和 spring整合 将项目名称为day29_02_struts2Spring下的scr目录下的Struts.xml文件拷贝到新项目的scr目录下 在新项目的WebRoot-- ...

  6. jQuery图片渐变特效的简单实现

    (document).ready(function() {(document).ready(function() {("div.baba").mouseleave(function ...

  7. 第五百八十四天 how can I 坚持

    好累啊,不知道怎么搞的,也没干啥啊,学习学的..不会吧. 哎. 吃粉蒸吃的都快吃吐了,得休息段时间,哈哈 没想象中的那么简单啊,太难了,哎,怎么考,压力啊.哎,也没啥. 洗澡睡觉,先休息.

  8. win10开始菜单打不开怎么办 win菜单键没反应解决办法

    win10开始菜单打不开怎么办 win菜单键没反应解决办法 —————————————————————————————————————————————————————————————————————— ...

  9. druid的安装

    最近想玩druid.druid的底层是fastbit索引的列式存储.采用分布式的zookeeper调度.实时大数据分析软件.主要针对OLAP操作. 搭环境搭环境.druid的核心成员成立了一个叫imp ...

  10. Django自定义分页、bottle、Flask

    一.使用django实现之定义分页 1.自定义分页在django模板语言中,通过a标签实现; 2.前段a标签使用<a href="/user_list/?page=1"> ...