C# For循环以创建超出结束条件的任务

C# For循环以创建超出结束条件的任务,c#,concurrency,C#,Concurrency,我有一个for循环,用于创建一些经过参数化的任务: int count = 16; List<Tuple<ulong, ulong>> brackets = GetBrackets(0L, (ulong)int.MaxValue, count); Task[] tasks = new Task[count]; s.Reset(); s.Start(); for(int i = 0; i < count; i++) { tasks[i] = Task.R

我有一个for循环,用于创建一些经过参数化的任务:

int count = 16;

List<Tuple<ulong, ulong>> brackets = GetBrackets(0L, (ulong)int.MaxValue, count);
Task[] tasks = new Task[count];

s.Reset();
s.Start();

for(int i = 0; i < count; i++)
{
    tasks[i] = Task.Run(() => TestLoop(brackets[i].Item1, brackets[i].Item2));
}

Task.WaitAll(tasks);

s.Stop();

times.Add(count, s.Elapsed);
然后不会抛出错误。此外,如果我使用断点遍历循环,则不会引发任何问题

对于repo,我还包括get括号,它只是将一个数字范围划分为几个块:

private List<Tuple<ulong, ulong>> GetBrackets(ulong start, ulong end, int threads)
{
    ulong all = (end - start);
    ulong block = (ulong)(all / (ulong)threads);
    List<Tuple<ulong, ulong>> brackets = new System.Collections.Generic.List<Tuple<ulong, ulong>>();

    ulong last = 0;
    for (int i=0; i < threads; i++)
    {
        brackets.Add(new Tuple<ulong, ulong>(last, (last + block - 1)));
        last += block;
    }

    // Hack
    brackets[brackets.Count - 1] = new Tuple<ulong, ulong>(
        brackets[brackets.Count - 1].Item1, end);

    return brackets;
}
private List get括号(ulong开始、ulong结束、int线程)
{
ulong all=(结束-开始);
ulong块=(ulong)(所有/(ulong)螺纹);
List方括号=new System.Collections.Generic.List();
ulong last=0;
对于(int i=0;i
有人能解释一下吗?

(这是类似帖子的复制品,但它们通常很难找到,症状往往略有不同。)

问题是您正在捕获循环中的变量
i

for(int i = 0; i < count; i++)
{
    tasks[i] = Task.Run(() => TestLoop(brackets[i].Item1, brackets[i].Item2));
}
或者,使用LINQ创建任务数组:

var tasks = brackets.Select(t => Task.Run(() => TestLoop(t.Item1, t.Item2));
                    .ToArray(); // Or ToList

你说得对,这就是解决办法。非常感谢!
for (int i = 0; i < count; i++)
{
    int index = i;
    tasks[i] = Task.Run(() => TestLoop(brackets[index].Item1, brackets[index].Item2));
}
var tasks = brackets.Select(t => Task.Run(() => TestLoop(t.Item1, t.Item2));
                    .ToArray(); // Or ToList