Windows Store apps开发[37]调用自己的异步函数
2012-10-02 11:55
465 查看
注:本文由BeyondVincent(破船)原创首发
转载请注明出处:BeyondVincent(破船)@DevDiv.com
更多内容请查看下面的帖子
[DevDiv原创]Windows
8 开发Step by Step
注1:本文译自Programming Windows, 6th Edition Charpter 7 Calling Your Own Async Methods假设你用类似下面的这个方法进行隔离存贮中文件保存的逻辑:
async void SaveFile(string text) { FileSavePicker picker = new FileSavePicker(); picker.DefaultFileExtension = ".txt"; picker.FileTypeChoices.Add("Text", new List<string> { ".txt" }); StorageFile storageFile = await picker.PickSaveFileAsync(); if (storageFile == null) return; await FileIO.WriteTextAsync(storageFile, txtbox.Text); }
这个方法必须标记为async,因为它有await关键字。然后你可以在OnSaveAsAppBarButtonClick函数中这样调用:
void OnSaveAsAppBarButtonClick(object sender, RoutedEventArgs args) { SaveFile(txtbox.Text); }
OnSaveAsAppBarButtonClick调用SaveFile发生什么呢:SaveFile开始执行,直到第一个await后的PickSaveFileAsync被调用,在这里,SaveFile函数终止并将控制权返回给OnSaveAsAppBarButtonClick函数。当PickSaveFileAsync结果准备好了,SaveFile剩余的代码继续被执行。
在这种特殊情况下,是正确的。然而,如果如果你想要OnSaveAsAppBarButtonClick方法等待SaveFile的执行,必须包含await关键字,并用async标识OnSaveAsAppBarButtonClick方法:
async void OnSaveAsAppBarButtonClick(object sender, RoutedEventArgs args) { await SaveFile(txtbox.Text); }
但是,当你这样做的话,SaveFile必须要改变一下。它不能再返回void。你可以有许多种方法修改SaveFile,但是可能最简单方法就是将返回类型修改为Task:
async Task SaveFile(string text) { ... }
在这里,你可能想将方法的名字改为SaveFileAsync,标识这是一个异步方法,可以被等待。即使在SaveFileAsync方法中没有写明运行在别的线程里,但是调用SaveFileAsync的异步方法会在另外的线程中处理。
下面的OnOpenAppBarButtonClick与ReadFileAsync方法又有点不同。你可能希望ReadFileAsync方法返回文件中的文本内容,所以返回类型不是Task,而是Task<string>:
async Task<string> ReadFileAsync() { FileOpenPicker picker = new FileOpenPicker(); picker.FileTypeFilter.Add(".txt"); StorageFile storageFile = await picker.PickSingleFileAsync(); if (storageFile == null) return null; return await FileIO.ReadTextAsync(storageFile); }
然后可以像如下调用ReadFileAsync:
async void OnOpenAppBarButtonClick(object sender, RoutedEventArgs args) { string text = await ReadFileAsync(); if (text != null) txtbox.Text = text; }
认识到这些所有的代码都在用户界面线程执行很重要。你不用担心UI对象的访问。FileIO的两个方法是在别的线程中运行的,由于ReadFileAsync方法调用了其它的异步方法,所以它也是异步的。方法中的其它代码则在UI线程运行。
如果你自己写的代码需要很长的处理时间,而你不希望在UI线程中处理,替代传统的技术(创建并执行线程)是考虑使用与Windows Runtime一样的基于任务的方法。你可以将要执行的代码以函数的方式传递给静态方法Task.Run。如下示例:
Task<double> BigJobAsync(int arg1, int arg2) { return Task.Run<double>(() => { double val = 0; // ... lengthy code return val; }); }在匿名方法中的所执行的内容都是在另外一个线程中进行的。这也会引起一个问题:它不能访问UI对象。然后,你可以按照下面的代码来访问这个方法:
double value = await BigJobAsync(22, 33);
如果,BigJobAsync中的匿名方法包含了await操作,那么需要将匿名方法标记为async:
Task<double> BigJobAsync(int arg1, int arg2) { return Task.Run<double>(async () => { double val = 0; // ... lengthy code return val; }); }
在后面的章节中,我会详细介绍异步处理。
相关文章推荐
- Windows Store apps开发[16]编写和使用自己的Windows Runtime组件
- Windows Store apps开发[35]如何创建自己的Windows Store账号来提交Apps
- Windows Store apps开发[76]企业部署Windows 8 Store 风格应用
- Windows Store apps开发[64]Windows 8 开发31日-第07日-共享合约
- Windows Store apps开发[42]C++/CX Part 3 of [n]: Under Construction
- Bing Maps SDK for Windows Store apps 1.基本使用-在地图上显示自己的位置
- Windows Store apps开发[49]自定义MessageDialog
- Windows Store apps开发[18]Metro Revealed Building Windows 8 apps with XAML and C#中文翻译全部汇总
- Windows Store apps开发[20]添加应用设置(SettingsPane)
- Windows Store apps开发[43]C++/CX Part 4 of [n]: Static Member Functions
- Windows Store apps开发[71]Windows 8 开发31日-第14日-地理位置
- Windows Store apps开发[55]变换(Transform)(1)简介
- Windows Store apps开发[78]Windows 8 开发31日-第20日-打印
- Windows Store apps开发[4]弹出画面(Flayouts)
- Windows Store apps开发[32]C++/CX Part 2 of [n]: hat(^)类型
- Windows Store apps开发[68]Windows 8 开发31日-第11日-锁屏程序
- Windows Store apps开发[7]视图模型与数据绑定
- Windows Store apps开发[15]如何获取设备当前位置
- Windows Store apps开发[31]Windows Store中企业账号和个人账号的区别
- 重新想象 Windows 8 Store Apps (37) - 契约: Settings Contract