2013-05-05 187 views
5

我用遞歸函數做一些如何等待所有異步操作?

public async void walk(StorageFolder folder) 
{ 
    IReadOnlyList<StorageFolder> subDirs = null; 
    subDirs = await folder.GetFoldersAsync(); 
    foreach (var subDir in subDirs) 
    { 
     var dirPath = new Profile() { FolderPath = subDir.Path}; 
     db.Insert(dirPath); 
     walk(subDir); 
    } 
    tbOut.Text = "Done!"; 
} 

所以,我想那tbOut.Text = 「完成!」;只有在所有迭代結束後才能完成。現在它正在進行迭代的同時發生。如果我運行這樣的功能

walk(fd); 
tbOut.Text = "Done!"; 

結果仍然一樣。此功能何時完全結束?

回答

4

您不需要等待完成您的步行功能的次呼叫。 所以你所要做的就是把它改成await walk(subDir)。但是,由於您無法等待無效函數,因此您必須稍作更改才能使其正常工作。 爲了使您的步行功能awaitable返回類型更改爲Task像這樣:

public async Task walk(StorageFolder folder) 
+3

事實上,你應該幾乎從不* *有'void'異步方法......他們基本上只是用來讓事件處理程序是異步的。 – 2013-05-05 15:28:36

+0

Thanx!這樣可行! – splash27 2013-05-05 15:36:28