c# - 在循环内的延迟任务内使用匿名方法

标签 c# lambda async-await task

我有以下内容-

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/

相关文章:

c# - 如何从 lambda 表达式中获取引用实例的实例

c# - 用 C# 缩小 JavaScript

python - lambda 到 python 中的函数转换

c++ - 如何改进 vector 搜索功能?

javascript - 如何在恢复功能之前等待 JavaScript Promise 解决?

c# - 如何在不重启 AppDomain 的情况下在运行时将模块添加到 MVC4

c# - 如何从派生类中只获取基类属性?

java - 使用 Java8 Streams 从另外两个列表创建对象列表

c# - Open 和 OpenAsync 之间的区别 (SqlConnection)

c# - 从属性 setter 调用异步方法