gpt4 book ai didi

c#-4.0 - 任务并行库和循环

转载 作者:行者123 更新时间:2023-11-30 23:56:49 24 4
gpt4 key购买 nike

我遇到过这样一种情况,即我正在创建的任务似乎只在我调试代码时才起作用。

正如您将在下面看到的,我不断收到索引超出范围的异常,这应该是不可能的,因为循环永远不会达到 5。

如果我在循环中添加一个断点,然后一直按 F10 直到程序结束,一切都会按预期进行。

知道我做错了什么吗?

using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[] numbers = new int[5] { 1, 2, 3, 4, 5 };
List<int> nums = new List<int>();

var tasks = new Task[5];

for (int i = 0; i < numbers.Length; i++)
{
tasks[i] = Task.Factory.StartNew(() =>
{
nums.Add(numbers[i]);
},
TaskCreationOptions.None);
}
Task.WaitAll(tasks);

for (int i = 0; i < nums.Count; i++)
{
Console.WriteLine(nums[i]);
}
Console.ReadLine();
}
}

我希望看到 1、2、3、4、5,但在运行异步时没有任何特定顺序

奇怪的是,这确实有效,但我看不出除了额外输入之外的区别。

using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[] numbers = new int[5] { 1, 2, 3, 4, 5 };
List<int> nums = new List<int>();

var tasks = new Task[5]
{
Task.Factory.StartNew(() => {nums.Add(numbers[0]);}, TaskCreationOptions.None),
Task.Factory.StartNew(() => {nums.Add(numbers[1]);}, TaskCreationOptions.None),
Task.Factory.StartNew(() => {nums.Add(numbers[2]);}, TaskCreationOptions.None),
Task.Factory.StartNew(() => {nums.Add(numbers[3]);}, TaskCreationOptions.None),
Task.Factory.StartNew(() => {nums.Add(numbers[4]);}, TaskCreationOptions.None)
};

Task.WaitAll(tasks);

for (int i = 0; i < nums.Count; i++)
{
Console.WriteLine(nums[i]);
}
Console.ReadLine();
}
}

谢谢

迈克

最佳答案

由于任务发生在循环外,任务执行时循环已经完成,此时i为5(循环退出条件)。

在您的第二个示例中,您不使用 i,而是对值进行硬编码,这样问题就消失了。

在调试器中,时间不同,任务可以在循环完成之前执行:同样,问题消失了。

我想你可以这样解决:

var ii=i;
tasks[i] = Task.Factory.StartNew(() =>
{
nums.Add(numbers[ii]);
},
TaskCreationOptions.None);

关于c#-4.0 - 任务并行库和循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7040075/

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