我有一个简单的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应用程序中不使用异步来完成我想要做的事情?
答案 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也非常适合。