任务不在enumerable.repeat中运行

coc*_*lla 1 c# concurrency task-parallel-library

我不明白为什么这个测试表明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);
    }
Run Code Online (Sandbox Code Playgroud)

结果:

Xunit.Sdk.EqualException:Assert.Equal()预期失败:10000实际:1

Tit*_*mir 7

问题是你没有创建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);
}
Run Code Online (Sandbox Code Playgroud)

你肯定需要一些锁定计数器,因为这个版本也失败了,但是计数器将是一个接近10000的值.