我有以下内容-
for (int i = 0; i < N; ++i)
{
var firstTask = DoSomething(...);
var task = anotherTask.ContinueWith(
(t) => ProcessResult(i, t.Result));
}
问题是 i 传递给 ProcessResult 的值似乎是它开始时的值,而不是迭代创建时的值。
防止这种情况的最佳方法是什么?
最佳答案
您需要将 i
的值捕获到它自己的变量中。
for (int i = 0; i < N; ++i)
{
var count = i;
var firstTask = DoSomething(...);
var task = anotherTask.ContinueWith(
(t) => ProcessResult(count, t.Result));
}
例子:
for (int i = 0; i < 5; ++i)
{
var a = i;
var task = Task.Delay(0).ContinueWith((t) => a.Dump());
}
输出如下:
0
2
1
4
3
但是这个:
for (int i = 0; i < 5; ++i)
{
var task = Task.Delay(0).ContinueWith((t) => i.Dump());
}
输出:
5
5
5
5
5
关于c# - 在循环内的延迟任务内使用匿名方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41608149/