C# & WPF 随手小计之一 ——初探async await 实现多线程处理
2016-10-28 19:33
465 查看
C# & WPF 随手小计之一 ——初探async await 实现多线程处理
时间 2014-11-25 22:37:00博客园精华区
原文 http://www.cnblogs.com/provissy/p/4122112.html 主题
C# WPF
嗯。。。我也是在园子待了不短时间的人了,一直以来汲取着园友的知识,感觉需要回馈什么。
于是以后有空我都会把一些小技巧小知识写下来,有时候可能会很短甚至很简单,但希望能帮到大家咯。
第一篇文章来说说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"); }); }
好了就这么多,以后会尽量写详细点。。。
相关文章推荐
- C# & WPF 随手小记之一 ——初探async await 实现多线程处理
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java) (转载)
- WPF 关于C#代码实现ControlTemplate
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(八) 完美实现A*寻径动态动画
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(五)实现2D人物动画②
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四)实现2D人物动画①
- C# 1.x 实现 "强类型元素唯一的 ArrayList"
- 字符串表达式校验&求值(C#实现)
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(五)实现2D人物动画②
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四)实现2D人物动画①
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十一)地图遮罩层的实现
- C#(文字类型转换)【下拉菜单->C#字体CodeBehind】附:【用C#实现生成PDF文档】
- 用C#实现的数据加密(二) &#8212;&#8212; 哈希算法
- 通用C#代码:实现"控件渐变"
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(五)实现2D人物动画②
- Asp.Net中C#实现的DataGrid小计,合计和纵向合并的通用方法
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十一)地图遮罩层的实现
- C#中利用"消息处理"实现在窗体中按下鼠标左键拖动窗体_L
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十一)地图遮罩层的实现
- C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(四)实现2D人物动画①