Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务未在enumerable.repeat中运行_C#_Concurrency_Task Parallel Library - Fatal编程技术网

C# 任务未在enumerable.repeat中运行

C# 任务未在enumerable.repeat中运行,c#,concurrency,task-parallel-library,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 () =>

我不明白为什么这个测试显示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()预期失败:10000 实际: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。

问题是您没有创建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。

++counter
不是线程安全的,您需要使用
Interlocked.Increment(ref-counter)如果要从多个线程更新int。@ScottChamberlain幸运的是,代码不能从多个线程访问它。如果代码更改为同时从多个线程访问
计数器
,则为是,这将成为一个问题。
+计数器
不是线程安全的,您需要使用
联锁。增量(ref-counter)如果要从多个线程更新int。@ScottChamberlain幸运的是,代码不能从多个线程访问它。如果代码更改为同时从多个线程访问
计数器
,则是,这将成为一个问题。