gpt4 book ai didi

c# - ArgumentOutOfRangeException 使用任务

转载 作者:太空宇宙 更新时间:2023-11-03 20:01:31 26 4
gpt4 key购买 nike

当我真的不确定为什么时,我得到一个 ArgumentOutOfRangeException

Task[] downloadTasks = new Task[music.Count];
for (int i = 0; i < music.Count; i++)
downloadTasks[i] = Task.Factory.StartNew(() => DownloadAudio(music[i], lstQueue.Items[i]));
Task.Factory.ContinueWhenAll(downloadTasks, (tasks) =>
{
MessageBox.Show("All the downloads have completed!",
"Success",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
});

for 循环i = 1 时运行时会发生错误,我不确定为什么当我确定 音乐时它会这样做。计数 = 1

我总是尝试用这种方法来替代 for 循环,但得到了同样的异常:

int index = 0;
foreach (MusicFile song in music)
{
downloadTasks[index] = Task.Factory.StartNew(() => DownloadAudio(song, lstQueue.Items[index]));
index++;
}

上面的代码中有什么地方可能导致这个吗?

我也不确定这是否相关,但是当我可以毫无异常(exception)地使用线程完成同样的事情时。直到我尝试执行任务时才出现此异常。

最佳答案

发生这种情况是因为您正在传递 StartNew Lambda Expression ,它隐式捕获了您的 i 变量。此效果称为 Closure .

为了获得正确的行为,您必须制作索引的本地副本:

for (int i = 0; i < music.Count; i++)
{
var currentIndex = i;
downloadTasks[i] = Task.Factory.StartNew(() =>
DownloadAudio(music[currentIndex],
lstQueue.Items[currentIndex]));
}

关于c# - ArgumentOutOfRangeException 使用任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27674369/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com