• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#&WPF随手小记之一——初探asyncawait实现多线程处理

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

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

第一篇文章来说说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"); });
}

 

 

 

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#实现限制软件的使用次数发布时间:2022-07-13
下一篇:
C#面向对象三大特性之二:继承发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap