C# & WPF 随手小记之一 ——初探async await 实现多线程处理
2014-11-25 22:37
429 查看
嗯。。。我也是在园子待了不短时间的人了,一直以来汲取着园友的知识,感觉需要回馈什么。
于是以后有空我都会把一些小技巧小知识写下来,有时候可能会很短甚至很简单,但希望能帮到大家咯。
第一篇文章来说说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是这么写的:
上面是微软给的写法,给按钮的响应方法加上async,然后await ExampleMethodAsync,让一个Length变量来接收返回值。
但是其实async和await还有另一种用法:
Task.Run 和 Lambda表达式,用起来其实更加简单。
在 => { }范围内写任何代码都是异步执行的,因此不用担心某几个语句是否会长时间堵住UI线程。
当然,你不能访问UI线程,否则会抛出异常。
如果不返回值,那就更简单了
好了就这么多,以后会尽量写详细点。。。
于是以后有空我都会把一些小技巧小知识写下来,有时候可能会很短甚至很简单,但希望能帮到大家咯。
第一篇文章来说说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 实现多线程处理
- C#实现异步编程的两个简单机制(异步委托&定时器)及Thread实现多线程
- C#中利用"消息处理"实现在窗体中按下鼠标左键拖动窗体_L
- 初探async await 实现多线程处理
- (续)用c#实现的数字图象处理----正在更新中!
- C#"焦点事件"中的Validating处理方法
- .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)
- .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)
- 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! C#/ASP.Net 实现
- 用C#(CSharp)实现SQL Server的事务处理
- 图象处理算法(c#实现)--浮雕
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)
- Asp.net(c#)实现多线程断点续传
- C# 没有动态数组,实现动态数组 && local copy(dll)
- 图象处理算法(c#实现)---反转
- 用C#实现的图象处理(源代码)------正在更新中!
- .Net/C# 封装磁盘目录文件搜索功能的工具类 (实现了与搜索相关的事件,以便插入客户处理代码)
- .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (第2版) (C# DIY HttpWebClient)
- C#中简单实现多线程