zoukankan      html  css  js  c++  java
  • 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 += "
    ";
        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}
    ", 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.
    ";
        // 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"); });
    }

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

  • 相关阅读:
    百度大脑IOCR财会票据识别技术接入小程序,快速实现财会票据识别
    接入百度大脑一站式内容审核平台,可快速提升审核效率
    利用百度AI快速开发出一款“问答机器人”并接入小程序
    接入百度大脑表格文字识别技术,快速降低信息电子化录入成本
    百度大脑UNIT3.0智能对话技术全面解析
    利用百度大脑,快速搭建一个红酒识别的小程序
    百度大脑UNIT3.0详解之嵌入式对话理解技术
    人群流量监控,安全管理升级
    python globals函数
    python reduce/map/filter函数区别
  • 原文地址:https://www.cnblogs.com/provissy/p/4122112.html
Copyright © 2011-2022 走看看