2013-05-05 19 views
5

Io uso funzione ricorsiva di fare qualcosaCome attendere tutte le operazioni asincrone?

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!"; 
} 

Quindi, voglio che tbOut.Text = "Fatto!"; sarà fatto solo al termine di tutte le iterazioni. Al momento è allo stesso tempo felice mentre le iterazioni sono in corso. Se eseguo questa funzione in questo modo

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

il risultato è sempre lo stesso. Come aspettare quando questa funzione finirà completamente?

risposta

4

Non si attende il completamento delle chiamate secondarie alla funzione di camminata. Quindi tutto ciò che devi fare è cambiarlo in await walk(subDir). Tuttavia, dal momento che non puoi attendere una funzione di vuoto, dovrai cambiarla un po 'per farlo funzionare. Per rendere la vostra funzione di passeggiata awaitable cambiare il tipo di ritorno a Task in questo modo:

public async Task walk(StorageFolder folder) 
+3

In effetti, si dovrebbe quasi mai * * avere un metodo asincrono void' '... sono praticamente presente solo per consentire i gestori di eventi essere asincroni. –

+0

Grazie! Che funzioni! – splash27

Problemi correlati