Windows Store apps开发[37]调用自各儿的异步函数

Windows Store apps开发[37]调用自己的异步函数

注:本文由BeyondVincent(破船)原创首发

        转载请注明出处:BeyondVincent(破船)@DevDiv.com

Windows Store apps开发[37]调用自各儿的异步函数


更多内容请查看下面的帖子


[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,因为它有awiat关键字。然后你可以在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,标识这是一个异步方法,可以被等待。


未完待续——2012/10/02 11:59 勋