【发布时间】:2020-04-22 02:36:07
【问题描述】:
这个非常简单的例子:
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) 这样的专用方法,我对如何使用 lambdas 来做这件事很感兴趣。
执行此操作的正常方法是什么 - 以不同的参数值并行启动相同的代码多次?
【问题讨论】:
-
是的,我知道,
await等不是WaitAll,它只是一个点头测试应用程序。 -
出于兴趣可以我将此代码封装为带有参数的Action/local lambda,然后在循环中使用不同的参数调用它?
Action<T>和<Action>似乎不相容......如果有人能就那个方向提供答案,那会很有趣