【发布时间】:2011-10-25 18:53:10
【问题描述】:
我遇到过这样一种情况,即我正在创建的任务似乎只在我调试代码时才起作用。
正如您将在下面看到的,我不断收到一个超出范围异常的索引,这是不可能的,因为循环永远不会达到 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();
}
}
}
谢谢
迈克
【问题讨论】:
-
为了清楚起见,您是说第一段代码不起作用,但第二段起作用,对吗?跨度>
标签: c#-4.0 task-parallel-library