2012-09-28 40 views
1

我有一个简单的Metro风格应用程序,它给我一个问题(异步&等待)。Metro风格应用程序中的异步和等待问题

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() 
} 

的问题是,文件名列表过早访问 - 之前,满载物品。
这是由于异步方法 - 当异步方法继续处理时,程序继续执行下一行代码。

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

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

+0

这似乎是错误的地方使用异步。你真的希望这是一个同步操作。 –

+0

@ Dan-o我正在使用GetFoldersAsync()和GetFilesAsync()。这些是否有同步替代方案? –

回答

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也会非常适合。

+0

+1。虽然不是'BlockingCollection',我会推荐[TPL Dataflow](http://msdn.microsoft.com/zh-cn/devlabs/gg585582.aspx)。 –

+0

@StephenCleary:好点; (我真的应该再次阅读Dataflow,我之前做过,但它显然没有陷入......) –

+0

@JonSkeet和StephenCleary - 感谢您的回复。 看来我需要以同步的方式做到这一点。现在我使用StorageFolder类中的GetFoldersAsync()和GetFilesAsync()。我可以使用什么“同步”替代方案来代替这两种方法? –