1

这段代码一直抛出 a stackoverflow exception,我感觉要么是因为await关键字导致堆栈填满,要么是线程可用性问题。但是,我不确定解决此问题的最佳方法是什么。

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()使用 if 代替,则在三次迭代后抛出错误,而results.Count在迭代至少一半集合(如果不是全部的话)后抛出它(它似乎有所不同)。它们都返回相同的值。在不导致 stackoverflow 异常或用完所有可用线程的情况下循环遍历的最佳方法是什么?

4

1 回答 1

2

认为这是一个应该解决的错误。

如果我是对的,你可以通过偶尔await Task.Yield()在你的循环中做一个来解决它。

于 2012-11-08T21:56:10.403 回答