2012-11-08 48 views
1

這段代碼一直拋出一個stackoverflow exception,我有一種感覺是因爲await關鍵字導致堆棧填滿或線程可用性問題。但是,我不確定補救這種情況的最佳方式是什麼。循環運行異步方法沒有Stackoverflow異常

results變量只是一個StorageFiles集合,如果它上面的1020左右,拋出異常;否則它的通常罰款。

private async void GetMusicTest() 
{ 
    var sfolder = await StorageFolder.GetFolderFromPathAsync(dir); 

    var query = sfolder.CreateFileQueryWithOptions(queryOptions); 

    var results = await query.GetFilesAsync(); 

    for (int i = 0; i < results.Count; i++) 
    { 
     MusicProperties mp = await results[i].Properties.GetMusicPropertiesAsync(); 
     Debug.WriteLine(mp.Title); 
    } 
} 

此代碼在控制檯應用程序中正常工作,但在桌面WinForm應用程序中使用時會引發錯誤。有趣的是,如果使用result.Count()代替,則錯誤在三次迭代後拋出,而results.Count在遍歷至少一半集合(如果不是全部的話)(似乎變化)之後拋出它。他們都返回相同的值。什麼是最好的循環方式,而不會導致stackoverflow異常或用盡所有可用的線程?

+0

看來這裏確實沒有足夠的代碼。沒有跡象表明你正在使用遞歸或其他任何會佔用堆棧空間的東西,所以問題可能包括其他代碼段。 – Servy

+0

我更新了代碼,但我並不認爲這些代碼會特別相關。除填充一些變量的構造函數之外,這是該類中唯一的其他方法。這是一個實例化並從'Winform'中調用的類。此人有類似的問題http://social.msdn.microsoft.com/Forums/en-AU/winappswithcsharp/thread/6b84fa0b-f873-43a2-b2ec-e930f95d1d8f – keyboardP

+0

爲什麼不發佈實際的異常呢? – sooniln

回答

2

think this is a bug應該解決。

如果我是對的,你可以通過在你的循環中偶爾做一個await Task.Yield()來解決它。

+0

謝謝,看起來確實如此。我現在就讓這個線程開放,但我認爲這可能是一個錯誤。 – keyboardP