enumerable.repeat 中没有 运行 的任务

tasks not run in enumerable.repeat

我不明白为什么这个测试显示 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。