2012-09-28 42 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()。我可以使用什麼「同步」替代方案來代替這兩種方法? –