异步编程,采用WorkgroupWorker,async和await关键字
金科玉律:不要在UI线程上执行耗时的操作;不要在除了UI线程之外的其他线程上访问UI控件!
NET1.1的BeginInvoke异步调用,需要准备3个方法:功能方法GetWebsiteLength,结果方法DownloadComplete,呼叫方法BeginInvoke!
但很不幸,在UI线程之外访问UI线程控件!调用失败。线程同步必须在线程所属进程的公共区域保留同步区,以此实现线程间的通讯。

二、C#2.0引入了BackgroundWorker,从而极大的简化了线程间通讯。

三、C#4.0引入的async和await关键字,使得一切变得如此简单!
async和await关键字
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace AsyncDemo
{
class MyForm:Form
{
Label lblInfo;
Button btnCaculate;
public MyForm()
{
lblInfo = new Label { Location = new System.Drawing.Point(10, 20), Text = "Length" };
btnCaculate = new Button { Location = new System.Drawing.Point(10, 50), Text = "GetLength" };
btnCaculate.Click += DisplayWebsiteLength;
AutoSize = true;
this.Controls.Add(lblInfo);
this.Controls.Add(btnCaculate);
} async void DisplayWebsiteLength(object sender,EventArgs e)
{
lblInfo.Text = "Fetching...";
using (System.Net.Http.HttpClient client = new System.Net.Http.HttpClient())
{
//string text = await client.GetStringAsync("http://flaaash.cnblogs.com");
//lblInfo.Text = text.Length.ToString(); Task<string> task = client.GetStringAsync("http://www.sina.com");
string contents = await task;
lblInfo.Text = contents.Length.ToString();
}
}
static void Main(string[] args)
{
Application.Run(new MyForm()); }
}
}
BackgroundWorker
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace AsyncDemo
{
class BackWorker : Form
{
Label lblInfo;
Button btnCaculate;
System.ComponentModel.BackgroundWorker worker; BackWorker()
{
lblInfo = new Label { Location = new System.Drawing.Point(10, 20), Text = "Length" };
btnCaculate = new Button { Location = new System.Drawing.Point(10, 50), Text = "GetLength" };
btnCaculate.Click += (o, e) => { worker.RunWorkerAsync(); };
this.Controls.Add(lblInfo);
this.Controls.Add(btnCaculate); worker = new System.ComponentModel.BackgroundWorker();
worker.DoWork += (o, e) =>
{
System.Net.WebClient client = new System.Net.WebClient();
string contents = client.DownloadString("http://www.sina.com");
e.Result = contents.Length;
};
worker.RunWorkerCompleted += (o, e) => lblInfo.Text = e.Result.ToString();
} public static void MainTest(string[] args)
{
Application.Run(new BackWorker());
}
}
}
异步编程,采用WorkgroupWorker,async和await关键字的更多相关文章
- 【转】剖析异步编程语法糖: async和await
一.难以被接受的async 自从C#5.0,语法糖大家庭又加入了两位新成员: async和await. 然而从我知道这两个家伙之后的很长一段时间,我甚至都没搞明白应该怎么使用它们,这种全新的异步编程模 ...
- [C#]剖析异步编程语法糖: async和await
一.难以被接受的async 自从C#5.0,语法糖大家庭又加入了两位新成员: async和await. 然而从我知道这两个家伙之后的很长一段时间,我甚至都没搞明白应该怎么使用它们,这种全新的异步编程模 ...
- C#基础系列——异步编程初探:async和await
前言:前面有篇从应用层面上面介绍了下多线程的几种用法,有博友就说到了async, await等新语法.确实,没有异步的多线程是单调的.乏味的,async和await是出现在C#5.0之后,它的出现给了 ...
- async和await关键字实现异步编程
async和await关键字实现异步编程 异步编程 概念 异步编程核心为异步操作,该操作一旦启动将在一段时间内完成.所谓异步,关键是实现了两点:(1)正在执行的此操作,不会阻塞原来的线程(2)一旦 ...
- .NET中的async和await关键字使用及Task异步调用实例
其实早在.NET 4.5的时候M$就在.NET中引入了async和await关键字(VB为Async和Await)来简化异步调用的编程模式.我也早就体验过了,现在写一篇日志来记录一下顺便凑日志数量(以 ...
- 浅谈async、await关键字 => 深谈async、await关键字
前言 之前写过有关异步的文章,对这方面一直比较弱,感觉还是不太理解,于是会花点时间去好好学习这一块,我们由浅入深,文中若有叙述不稳妥之处,还请批评指正. 话题 (1)是不是将方法用async关键字标识 ...
- Async 与 Await 关键字研究
1 Aynsc 和 Await 关键字的研究 在 .NET 4.0 以后,基于 Task 的异步编程模式大行其道,因其大大简化了异步编程所带来的大量代码工作而深受编程人员的欢迎,如果你曾 ...
- 为什么我们要使用Async、Await关键字
前不久,在工作中由于默认(xihuan)使用Async.Await关键字受到了很多质问,所以由此引发这篇博文“为什么我们要用Async/Await关键字”,请听下面分解: Async/Await关键字 ...
- 多线程编程学习笔记——async和await(二)
接上文 多线程编程学习笔记——async和await(一) 三. 对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...
随机推荐
- kernel/vsprintf.c
/* * linux/kernel/vsprintf.c * * Copyright (C) 1991, 1992 Linus Torvalds */ /* vsprintf.c -- Lars ...
- C++的深拷贝与浅拷贝
对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面是一个类对象拷贝的简单例子. #i ...
- Here's to the crazy ones.
Here's to the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square h ...
- 【python】jiraAPI使用教程 自动创建jira问题单并置状态为OPEN
环境依赖 : python库 redis jira 安装命令:pip install redis pip install jira redis服务安装命令: $sudo apt-get update ...
- 使用cocos2d-x3.4结合cocos2.1.5制作小游戏《亲亲小熊》
在最新的cocos集成环境中,CocosStudio已经集成到cocos中了,至于界面的制作和编辑器的基本使用在cocos官网有详细教程, 这里就不细说,资源下载和详情请参看官网教程:http://c ...
- assign、copy 、retain等关键字的含义
assign: 简单赋值,不更改索引计数copy: 建立一个索引计数为1的对象,然后释放旧对象retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1Copy其实是建立了一个 ...
- 打算从oschina的博客搬运到cnblog了
如题,感觉cnblog似乎要更加专业一点,顺便也禁水.提高下文章质量 以后就都是干货了 oschina原址 顺便庆祝一下Windows Live Writer配置成功
- Python 类与作用域——一些测试
/* 一 */ >>> class T (): a = 0 b = a >>> T.b 0 >>> del T /* 二 */ >>& ...
- 更新日志(建议升级到2016.12.17) && 更新程序的方法
更新程序的方法: 1,在控制面板里点击备份当前数据库文件到磁盘,把当天获取的信息从内存写到磁盘/存储卡.2,下载最新版的源码 wget -O "infopi.zip" " ...
- ueditor调用其中的附件上传功能
ueditor实际上是集成了webuploader, 在做内容发布的时候想既有ueditor又有单独的附件上传按钮,这时再加载一个webuploader就显得过于臃肿了,单独利用ueditor的上传功 ...