Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在没有Stackoverflow异常的情况下在循环中运行异步方法_C#_Multithreading_Asynchronous_Windows 8_Windows Runtime - Fatal编程技术网

C# 在没有Stackoverflow异常的情况下在循环中运行异步方法

C# 在没有Stackoverflow异常的情况下在循环中运行异步方法,c#,multithreading,asynchronous,windows-8,windows-runtime,C#,Multithreading,Asynchronous,Windows 8,Windows Runtime,这段代码不断抛出一个stackoverflow异常,我感觉这要么是因为wait关键字导致堆栈填满,要么是线程可用性问题。然而,我不确定最好的补救办法是什么 results变量只是StorageFiles的集合,如果大于1020左右,则抛出异常;否则通常没问题 private async void GetMusicTest() { var sfolder=wait-StorageFolder.GetFolderFromPathAsync(dir); var query=sfolder.Create

这段代码不断抛出一个
stackoverflow异常
,我感觉这要么是因为
wait
关键字导致堆栈填满,要么是线程可用性问题。然而,我不确定最好的补救办法是什么

results
变量只是
StorageFiles
的集合,如果大于1020左右,则抛出异常;否则通常没问题

private async void GetMusicTest()
{
var sfolder=wait-StorageFolder.GetFolderFromPathAsync(dir);
var query=sfolder.CreateFileQueryWithOptions(queryOptions);
var results=await query.getfileasync();
for(int i=0;i
此代码在控制台应用程序中运行良好,但在桌面WinForm应用程序中使用时会引发错误

有趣的是,如果改用
result.Count()
,则错误会在三次迭代后抛出,而
results.Count
则会在迭代至少一半的集合(如果不是全部的话)后抛出(它似乎有所不同)。它们都返回相同的值。在不导致stackoverflow异常或用尽所有可用线程的情况下循环的最佳方式是什么?

I应该解决这个问题


如果我是对的,您可以通过偶尔在循环中执行
wait Task.Yield()
来解决这个问题。

这里似乎真的没有足够的代码。没有迹象表明您正在使用递归或任何其他会占用堆栈上大量空间的操作,因此问题可能包括代码的其他部分。我已经更新了代码,但我认为这些行不会特别相关。除了构造函数填充一些变量之外,这是类中唯一的其他方法。这是一个从
Winform
实例化并调用的类。这个人也有类似的问题,为什么不发布实际的异常呢?我试过了,看到了同样的问题。实际上,您可以简化它—只需放置一个for循环(inti=0;i<1200;i++),然后在循环中调用第一个wait-StorageFolder.GetFolderFromPathAsync(dir)调用,就可以得到异常。一定是他们把任务链接起来的方式。@AndrewS谢谢你的确认,我很高兴我没有遗漏任何明显的东西。我整晚都在想办法!谢谢,看起来确实有可能。我暂时不打开这个线程,但我认为它可能是一个bug。
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);
    }
}