c# - 在循环 : how to pass values that can be changed inside the loop? 内启动任务

标签 c# task task-parallel-library

<分区>

我正在尝试在 while 循环中使用 TPL,我需要将一些值传递给任务,然后这些值会更改到循环中。例如,这里显示了一个索引递增的示例(必须在请求创建任务的行之后):

int index = 0;
Task[] tasks;
while(/*condition*/)
{
    tasks[index] = Task.Factory.StartNew(() => DoJob(index));
    index++;
}

但是当然它不起作用,因为索引值可以在任务开始之前递增。一个可能的解决方案是也传递一个 WaitHandle,在递增索引之前等待它并且必须将其发送到 DoJob 方法中,但在我看来这并不是一个很好的解决方案。还有其他想法吗?

最佳答案

将值赋给循环内的一个临时变量:

int index = 0;
Task[] tasks;
while(/*condition*/)
{
    int value = index;
    tasks[index] = Task.Factory.StartNew(() => DoJob(value));
    index++;
}

这样每个任务都会有自己的 indexwhile 循环迭代期间所拥有的值的副本,在该循环中调用 StartNew 制作完成。

关于c# - 在循环 : how to pass values that can be changed inside the loop? 内启动任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5444673/

相关文章:

c# - Task.IsCompleted 使用缓存标志的原因是什么?

c# - 依赖于访问修改后的闭包的实现是否不可取?

c# - Task.WhenAny 是否将某些任务优先于其他任务?

c# - 我可以使用 async 和 Task.Run 使复杂的方法异步吗?

ios - 等待 session.dataTask 上的任务返回

c# - async/await 与 ConfigureAwait 的 continueOnCapturedContext 参数和用于异步延续的 SynchronizationContext

c# - 我应该将 await 与 async Action 方法一起使用吗?

c# - RavenDB 中的子字符串搜索

c# - 将 BasedOn 属性与在不同字典中定义的样式一起使用

c# - 上传前 MVC 转换图像