在循环内部的延迟任务中使用匿名方法

Hec*_*tor 5 c# lambda task async-await

我有以下 -

for (int i = 0; i < N; ++i)
{
    var firstTask = DoSomething(...);

    var task = anotherTask.ContinueWith(
        (t) => ProcessResult(i, t.Result));
}
Run Code Online (Sandbox Code Playgroud)

问题是传递给ProcessResult的i的值似乎是它启动时的值,而不是创建它时的迭代值.

防止这种情况的最佳方法是什么?

Hei*_*tad 2

您需要将 的值捕获i到其自己的变量中。

for (int i = 0; i < N; ++i)
{
    var count = i;

    var firstTask = DoSomething(...);

    var task = anotherTask.ContinueWith(
        (t) => ProcessResult(count, t.Result));
}
Run Code Online (Sandbox Code Playgroud)

例子:

for (int i = 0; i < 5; ++i)
{
    var a = i;
    var task = Task.Delay(0).ContinueWith((t) => a.Dump());
}
Run Code Online (Sandbox Code Playgroud)

这输出类似:

0
2
1
4
3
Run Code Online (Sandbox Code Playgroud)

但是这个:

for (int i = 0; i < 5; ++i)
{
    var task = Task.Delay(0).ContinueWith((t) => i.Dump());
}
Run Code Online (Sandbox Code Playgroud)

输出:

5
5
5
5
5
Run Code Online (Sandbox Code Playgroud)