带界面的应用程序为了防止卡死界面,经常要用到异步编程,常用的方法无论是线程还是异步回调,都不可避免的破坏了代码的流畅性和可读性。今天体验了一把async/await,感觉太爽了,异步开发就像同步一样,完全由Framework底层来处理异步问题。写个小Demo:
假设有一个方法对给定的两个整数进行复杂运算,会耗费较长时间:
- public void Compute(int x, int y)
- {
- //计算过程省略
- return ......;
- }
为它封装一个异步方法:
- public Task<int> ComputeAsync(int x, int y)
- {
- //把原方法包装到Task.Run中去
- return Task.Run<int>(() => { return Compute(x, y); });
- }
假设我们是在按一个按钮的时候调用Compute方法:
- //用async修饰一下调用方法,这样在方法里才能使用await关键字
- private async void Button_Click(object sender, EventArgs e)
- {
- try
- {
- //await表示等待ComputeAsync异步执行完毕,注意它不阻塞,因此界面线程不受影响。
- int sum = await ComputeAsync(100, 100);
- //异步执行完毕后,会接下来执行下面的代码,就像在回调中一样
- MessageBox.Show(string.Format("Result is {0}", sum));
- }
- catch
- {
- MessageBox.Show("Error");
- }
- }
看一看Button_Click的代码,和同步调用时几乎一模一样,我们只是加了async和await关键字而已,异步过程完全由Framework底层去处理,太爽了~~
本文转自 BoyTNT 51CTO博客,原文链接:http://blog.51cto.com/boytnt/852253,如需转载请自行联系原作者