这个非常简单的例子:
int numLanes = 8;
var tasks = new List<Task>();
for (var i = 0; i < numLanes; ++i)
{
var t = new Task(() =>
{
Console.WriteLine($"Lane {i}");
});
tasks.Add(t);
}
tasks.ForEach((t) => t.Start());
Task.WaitAll(tasks.ToArray());
生产:
Lane 8
Lane 8
Lane 8
Lane 8
Lane 8
Lane 8
Lane 8
Lane 8
参数与预期不符i
没有正确通过。我曾想过使用Action<int>
包装代码,但不知道我会怎么做。我不想编写像这样的专用方法Task CreateTask(int i)
我感兴趣的是如何使用 lambda 来做到这一点。
执行此操作的正常方法是什么 - 使用不同的参数值并行多次启动相同的代码?
你有一个捕获的循环变量i
,尝试在循环内添加临时变量并将其传递给Task
for (var i = 0; i < numLanes; ++i)
{
var temp = i;
var t = new Task(() =>
{
Console.WriteLine($"Lane {temp}");
});
tasks.Add(t);
}
进一步阅读如何在 C# 中捕获变量而不是搬起石头砸自己的脚 https://medium.com/@unicorn_dev/how-to-capture-a-variable-in-c-and-not-to-shoot-yourself-in-the-foot-d169aa161aa6. foreach
循环在 C# 5 之前具有相同的行为,但根据上面的链接
随着 C# 5.0 标准的发布,这种行为被改变了
在每个循环迭代中声明迭代器变量,而不是
在编译阶段之前,但对于所有其他结构
类似的行为仍然没有任何改变
所以,你可以使用foreach
没有临时变量
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)