c# - 任务未在 enumerable.repeat 中运行

标签 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);
    }

结果:

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/

相关文章:

mysql - 可串行化冲突以及为什么 2 次读取不冲突?

c# - 在使用 await 的 WCF 方法中返回一个项目

c# - async void 方法的用例,重新审视

c# - ListView + POCO

c# - 类属性,在内部可获取和可设置,但只能在外部获取

http - 从同一浏览器调用时,为什么go.mux会阻塞time.sleep?

ios - 主队列异步与默认队列异步说明

c# - 从 EPS 文件中提取 XMP 元数据

c# - 如何使用 Ninject InRequestScope 处理异步调用?

c# - 如何通过Escape键正确取消并行异步IO任务?