C# & WPF 随手小计之一 ——初探async await 实现多线程处理

嗯。。。我也是在园子待了不短时间的人了,一直以来汲取着园友的知识,感觉需要回馈什么。

于是以后有空我都会把一些小技巧小知识写下来,有时候可能会很短甚至很简单,但希望能帮到大家咯。

第一篇文章来说说async 和 await吧。

这是微软关于Async的介绍:http://msdn.microsoft.com/en-us/library/hh156513.aspx

这是await :http://msdn.microsoft.com/en-us/library/hh156528.aspx

这是综合起来讲:http://msdn.microsoft.com/en-us/library/hh191443.aspx

async和await用起来并不是很难,大部分人是这么用的,微软的sample是这么写的:

private async void StartButton_Click(object sender, RoutedEventArgs e)
{
    // ExampleMethodAsync returns a Task<int>, which means that the method
    // eventually produces an int result. However, ExampleMethodAsync returns
    // the Task<int> value as soon as it reaches an await.
    ResultsTextBox.Text += "\n";
    try
    {
        int length = await ExampleMethodAsync();
        // Note that you could put "await ExampleMethodAsync()" in the next line where
        // "length" is, but due to when ‘+=‘ fetches the value of ResultsTextBox, you
        // would not see the global side effect of ExampleMethodAsync setting the text.
        ResultsTextBox.Text += String.Format("Length: {0}\n", length);
    }
    catch (Exception)
    {
        // Process the exception if one occurs.
    }
}

public async Task<int> ExampleMethodAsync()
{
    var httpClient = new HttpClient();
    int exampleInt = (await httpClient.GetStringAsync("http://msdn.microsoft.com")).Length;
    ResultsTextBox.Text += "Preparing to finish ExampleMethodAsync.\n";
    // After the following return statement, any method that‘s awaiting
    // ExampleMethodAsync (in this case, StartButton_Click) can get the
    // integer result.
    return exampleInt;
}
// Output:
// Preparing to finish ExampleMethodAsync.
// Length: 53292

上面是微软给的写法,给按钮的响应方法加上async,然后await ExampleMethodAsync,让一个Length变量来接收返回值。

但是其实async和await还有另一种用法:

        private async void button_Click(object sender, RoutedEventArgs e)
        {
            TB_Result.Text = await exampleAsync();
        }
        private async Task<string> exampleAsync()
        {
             return await Task.Run(() =>
             {
                 WebClient w = new WebClient();
                 w.DownloadFile("http://provissy.com", "webPage1");
                 w.DownloadFile("http://microsoft.com", "webPage2");
                 string a = w.DownloadString("http://microsoft.com");
                 return a;
             });
        }

Task.Run 和 Lambda表达式,用起来其实更加简单。

在 => { }范围内写任何代码都是异步执行的,因此不用担心某几个语句是否会长时间堵住UI线程。

当然,你不能访问UI线程,否则会抛出异常。

如果不返回值,那就更简单了

        private async Task exampleAsync()
        {             // 用 await exampleAsync(); 来调用即可,会立即返回。
             await Task.Run(() =>
             {
                 WebClient w = new WebClient();
                 w.DownloadFile("http://provissy.com", "webPage1");
                 w.DownloadFile("http://microsoft.com", "webPage2");
             });        }    

好了就这么多,以后会尽量写详细点。。。

时间: 2024-08-05 23:19:43

C# & WPF 随手小计之一 ——初探async await 实现多线程处理的相关文章

随手小计之制作U盘启动盘和系统安装

一.U盘启动盘的制作 工具:软碟U盘启动 镜像:wepe_64.iso,使用微PE工具箱2.0生成的PE系统镜像,208M存放在百度网盘,条件允许可以访问微PE官网下载微PE工具箱2.0自主生成ISO文件 生成ISO文件:打开微PE工具箱2.0,选择如图所示 修改ISO文件输出路径,点击“立即生成ISO” 打开软碟U盘启动工具,选择“PE启动盘”,选择你的U盘,选择刚才生成的镜像文件,点击“制作PE启动盘“,等待完成即可 二.PE的进入 将电脑关机,把U盘启动盘插入电脑然后开机,在开机几秒内按下

我也来说说C#中的异步:async/await

序 最近看了一些园友们写的有关于异步的文章,受益匪浅,写这篇文章的目的是想把自己之前看到的文章做一个总结,同时也希望通过更加通俗易懂的语言让大家了解"异步"编程. 1:什么是异步 应用程序在启动后,会产生一个进程,进程是构成应用程序资源的集合.在进程内部有称之为线程的对象,线程才是真正负责执行运行命令的. 线程: 1:默认情况下,一个应用程序只会有一个线程,从程序开始到结束. 2:一个进程如果有多个线程,那么多个线程将会共享进程内的资源. 3:线程不是派生于不同的线程. 一般来说,我们

汽车仪表是如何计算总计里程和小计里程的?

现在汽车仪表大部分的总计里程和小计里程都是显示在屏幕上的,这包括段码屏.点阵屏.TFT彩屏等,虽然显示形式不一样,但是从业务需求和软件应用层的实现策略来讲,原理应该都是通用的.本文不涉及具体车型,仅对一般的业务逻辑作介绍,一是为了自己总结记录,二是期望吸引同行或爱好者交流. 1.总计里程 ODO(Total Odometer )即总计里程,顾名思义,主要作用是记录汽车总的行驶里程,一般来讲,在用户使用过程中是无法对其修改或清零的,因为它是对二手汽车价值评估的一项重要数值,当然随意篡改这一数据也是

traits技法小计

在学习算法导论的时候,对于各数据结构,自然是实现一个才算掌握,工具当然是template编程,但是自己的demo经常存在很多问题,比如没有给出迭代器啊,操作符重载不够啊等等设计上的问题,而某些问题实际上是从设计之初就该考虑的大框架,而非小细节.对于C++而言,STL无疑是最佳的参考资料,侯捷先生的STL源码剖析一书给我们良好的示范,而直接从第四章开始看会云里雾里,无法得其精髓,因此在学习算法之余决定尾随侯捷先生脚步,学习STL traits技法,从而可以从STL中学到更多的数据结构实现. 收获自

设计模式小计——23种设计模式3

责任链模式Chain of Responsibility 使多个对象都有机会处理请求,从而避免请求的发送者和接受者间的耦合关系,并沿着这条链传递请求,直到有对象处理它为止 责任链模式关键是建立链接关系,在链中决定谁来处理请求 //抽象处理者 public abstract class Handle{ private Handle nextHandle;//链的下一个节点 public final Response handleMessage(Request request){ Response

设计模式小计——23种设计模式1

单例模式Singleton Pattern 确保类只有一个实例,而且自行实例化并向整个系统提供这个实例 public class Singleton{ private static final Singleton singleton = new Singleton(); private Singleton(){} public static Singleton getSingleton(){ return singleton; } } 节省内存开支,减少性能开销,应用启动产生单例对象,永久驻留内

设计模式小计——23种设计模式2

模板方法模式Template Method Pattern 定义一个操作的算法的框架,是的子类可以不改变算法结构即可重定义该算法一些特定步骤 public abstract class AbstractClass{//抽象模板类 protected abstract void method1();//算法步骤1 protected abstract void method2();//算法步骤2 public void templateMethod(){//模板方法,定义算法结构 this.met

Sql使用WITH ROLLUP 进行分类汇总及小计功能

效果如下: 测试代码如下: CREATE TABLE #test    (      Name VARCHAR(10) ,      [procedure] CHAR(1) ,      model VARCHAR(5) ,      quantity INT    ); INSERT  INTO #test        SELECT  'A' ,                '1' ,                'φ50' ,                500        UNI

RandomStrngUtils工具类小计

//产生5位长度的随机字符串,中文环境下是乱码 RandomStringUtils.random(5); //使用指定的字符生成5位长度的随机字符串 RandomStringUtils.random(5, new char[]{'a','b','c','d','e','f', '1', '2', '3'}); //生成指定长度的字母和数字的随机组合字符串 RandomStringUtils.randomAlphanumeric(5); //生成随机数字字符串 RandomStringUtils.