金科玉律:不要在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关键字的更多相关文章

  1. 【转】剖析异步编程语法糖: async和await

    一.难以被接受的async 自从C#5.0,语法糖大家庭又加入了两位新成员: async和await. 然而从我知道这两个家伙之后的很长一段时间,我甚至都没搞明白应该怎么使用它们,这种全新的异步编程模 ...

  2. [C#]剖析异步编程语法糖: async和await

    一.难以被接受的async 自从C#5.0,语法糖大家庭又加入了两位新成员: async和await. 然而从我知道这两个家伙之后的很长一段时间,我甚至都没搞明白应该怎么使用它们,这种全新的异步编程模 ...

  3. C#基础系列——异步编程初探:async和await

    前言:前面有篇从应用层面上面介绍了下多线程的几种用法,有博友就说到了async, await等新语法.确实,没有异步的多线程是单调的.乏味的,async和await是出现在C#5.0之后,它的出现给了 ...

  4. async和await关键字实现异步编程

    async和await关键字实现异步编程 异步编程   概念 异步编程核心为异步操作,该操作一旦启动将在一段时间内完成.所谓异步,关键是实现了两点:(1)正在执行的此操作,不会阻塞原来的线程(2)一旦 ...

  5. .NET中的async和await关键字使用及Task异步调用实例

    其实早在.NET 4.5的时候M$就在.NET中引入了async和await关键字(VB为Async和Await)来简化异步调用的编程模式.我也早就体验过了,现在写一篇日志来记录一下顺便凑日志数量(以 ...

  6. 浅谈async、await关键字 => 深谈async、await关键字

    前言 之前写过有关异步的文章,对这方面一直比较弱,感觉还是不太理解,于是会花点时间去好好学习这一块,我们由浅入深,文中若有叙述不稳妥之处,还请批评指正. 话题 (1)是不是将方法用async关键字标识 ...

  7. Async 与 Await 关键字研究

    1        Aynsc 和 Await 关键字的研究 在 .NET 4.0 以后,基于 Task 的异步编程模式大行其道,因其大大简化了异步编程所带来的大量代码工作而深受编程人员的欢迎,如果你曾 ...

  8. 为什么我们要使用Async、Await关键字

    前不久,在工作中由于默认(xihuan)使用Async.Await关键字受到了很多质问,所以由此引发这篇博文“为什么我们要用Async/Await关键字”,请听下面分解: Async/Await关键字 ...

  9. 多线程编程学习笔记——async和await(二)

    接上文 多线程编程学习笔记——async和await(一) 三.   对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...

随机推荐

  1. P1382 光棍组织

    我现在TMD连dfs都不会写了 原题: MM 虽然一辈子只要一个,但是也得早点解决.于是,n 个光棍们自发组成了一个光棍组织(ruffian organization,By Wind 乱译).现在,光 ...

  2. 【总结】matlab求两个序列的相关性

    首先说说自相关和互相关的概念.  自相关 在统计学中的定义,自相关函数就是将一个有序的随机变量系列与其自身作比较.每个不存在相位差的系列,都与其都与其自身相似,即在此情况下,自相关函数值最大. 在信号 ...

  3. 如何让老式浏览器支持html5新增的语义元素

    html5新增加了一些语义元素,如header, footer, nav, aritcle, aside,等等. 然而,有些老款浏览器无法识别这些元素,会把它们当成 inline 元素对待,这会导致一 ...

  4. python socket

    #!/usr/bin/env python import sys import time import socket s = socket.fromfd(sys.stdin.fileno(),sock ...

  5. C# FileSystemWatcher监听文件事件

    现有一个需求如下:监控某个目录中的文件修改,创建,删除等信息,并记录下来. 这里用到FileSystemWatcher类.由于考虑到文件的写入量会很频率,所以考虑先将监听到的消息记录到内存中. 监听部 ...

  6. 在ASP.NET Web API中使用OData

    http://www.alixixi.com/program/a/2015063094986.shtml 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在A ...

  7. Angular中的jsonp

    1.一般我们使用Angualr中的jsonp值这样使用的:注入$http服务 这样使用jsonp的方式可以支持多数api,但是douban不支持无法使用 module.controller('InTh ...

  8. meta 标签 详细说明

    meta 标签可提供页面元素信息, 使用键值对的定义方式,可以记录网页上的主要信息,也可以自定义键值对 属性 content(必须),name,http-equiv,scheme,lang 常用 me ...

  9. ruby发送邮件方法

    #encoding:utf-8require 'mail'def send_email sum,fail,case_path,name,receive smtp = { :address => ...

  10. [zz]Maya C++ API Programming Tips

    Maya C++ API Programming Tips source : http://wanochoi.com/?page_id=1588 How to handle the multiple ...