c# - Task.Run(),传递参数给

标签 c# asynchronous concurrency task

考虑以下代码:

attempt = 0;
for (int counter = 0; counter < 8; counter++)
{
    if (attempt < totalitems)
    {
        Tasklist<output>.Add(Task.Run(() =>
        {
            return someasynctask(inputList[attempt]);
        }));
    }
    else
    {
        break;
    }
    attempt++;
}
await Task.WhenAll(Tasklist).ConfigureAwait(false);

例如,我想要 8 个并发任务,每个任务同时处理不同的输入,最后检查结果,当所有任务都完成时。 因为我不是在等待 Task.Run() 的完成attempt在任务开始前增加,当任务开始时,inputList中可能有项目未处理或处理两次或更多次(因为 attempt 值的不确定性。

怎么做?

最佳答案

问题在于“lambda”的使用:当 Task.Run(() => return someasynctask(inputList[attempt])); 在执行过程中到达时,变量 attempt 被捕获,而不是它的值(即它是一个“闭包”)。因此,当执行 lambda 时,将使用该特定时刻的变量值。

只需在 lambda 之前添加变量的临时副本,然后使用它。例如

if (attempt < totalitems)
{
    int localAttempt = attempt;
    Tasklist<output>.Add(Task.Run(() =>
    {
        return someasynctask(inputList[localAttempt]);
    }));
}

关于c# - Task.Run(),传递参数给,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46804976/

相关文章:

java - JDK提供的并发类是否需要使用实例自身的内在锁进行同步?

c# - LINQ to List<T> 给出错误

c# - 为什么在将字符串转换为 float 时会出现 FormatException?

.net - 在同一个套接字上可以进行多少个异步套接字请求?

c++ - 并发可变优先级队列

Java 执行器 : how can I set task priority?

c# - 在 AutoCAD 中以一定角度插入 block (C#)

c# - 在不知道谁是父级的情况下从父级中删除 View

c# - 无效方差 : The type parameter must be invariantly valid but is covariant

javascript - 如何在 Node.js 中跳过 "async.forEachOf"循环迭代