我不明白为什么这个测试显示lambda跑了一次。我只能看到它如何产生 0 或 10000。但只有一次?理想情况下,我希望执行所有任务,就像 Task.WhenAll 上的工具提示文档所建议的那样。
[Fact]
public async Task FireLotsOfQueries()
{
var counter = 0;
var taskList = Enumerable.Repeat(Task.Run(async () =>
{
++counter;
await Task.Delay(1000);
}), 10000);
await Task.WhenAll(taskList);
Assert.Equal(10000, counter);
}
结果:
Xunit.Sdk.EqualException: Assert.Equal() Failure Expected: 10000 Actual: 1
最佳答案
问题是您没有创建 1000 个任务。您正在创建一个包含相同任务 1000 次的枚举。试试这个:
public async Task FireLotsOfQueries()
{
var counter = 0;
var taskList = Enumerable.Range(0, 10000)
.Select(_=> Task.Run(async () =>
{
++counter;
await Task.Delay(1000);
}));
await Task.WhenAll(taskList);
Assert.Equal(10000, counter);
}
您肯定需要对计数器进行一些锁定,因为此版本也失败了,但计数器的值将接近 10000。
关于c# - 任务未在 enumerable.repeat 中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45871031/