异步&在Metro Style应用程序中等待问题

时间:2012-09-28 22:06:11

标签: c# xaml windows-8 microsoft-metro winrt-xaml

我有一个简单的Metro风格应用程序给我一个问题(async& await)。

List<string> fileNames = new List<string>();
...
...
LoadList();
...
...
(Problem) Code that accesses the elements of the fileNames List
...
...

private async void LoadList()
{
    // Code that loops through a directory and adds the 
    // file names to the fileNames List using GetFilesAsync()
}

问题是fileNames List过早访问 - 在它完全加载项目之前。
这是因为异步方法 - 程序继续下一行代码,而异步方法继续处理。

如何在完全加载后访问List(异步方法完成后)?

有没有办法在Metro应用程序中不使用异步来完成我想要做的事情?

1 个答案:

答案 0 :(得分:3)

你需要调用方法也是异步的 - 而不是让变量fileNames,我会让LoadList方法返回它。所以你有:

public async Task ProcessFiles()
{
    List<string> fileNames = await LoadList();
    // Now process the files
}

public async Task<List<string>> LoadList()
{
    List<string> fileNames = new List<string>();
    // Do stuff...
    return fileNames;
}

这意味着您需要等待所有文件在开始处理之前找到;如果你想要处理它们,你找到它们,你需要考虑使用某种BlockingCollection。编辑:斯蒂芬指出,TPL Dataflow也非常适合。