Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.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# 在LINQ lambda表达式中生成任务数组时使用信号量lim_C#_Multithreading_Linq - Fatal编程技术网

C# 在LINQ lambda表达式中生成任务数组时使用信号量lim

C# 在LINQ lambda表达式中生成任务数组时使用信号量lim,c#,multithreading,linq,C#,Multithreading,Linq,我使用LINQ lambda表达式生成任务数组,并将它们添加到任务列表中。我想实现一个信号量来限制在给定时间点处理中的任务数量 下面是表示我当前拥有的代码: 课堂测试{ 私有列表任务; 公共无效启动{ 任务=新列表; 添加任务; } 私有任务{ tasks.AddRange 项目 .其中x=>x.InProcess==false 。选择异步项=>{ 等待工作项; } .托雷 ; } } 我想实现类似的目标: 课堂测试{ 私有列表任务; 私有信号量lim信号量; 公共无效启动{ 任务=新列表; 信

我使用LINQ lambda表达式生成任务数组,并将它们添加到任务列表中。我想实现一个信号量来限制在给定时间点处理中的任务数量

下面是表示我当前拥有的代码:

课堂测试{ 私有列表任务; 公共无效启动{ 任务=新列表; 添加任务; } 私有任务{ tasks.AddRange 项目 .其中x=>x.InProcess==false 。选择异步项=>{ 等待工作项; } .托雷 ; } } 我想实现类似的目标:

课堂测试{ 私有列表任务; 私有信号量lim信号量; 公共无效启动{ 任务=新列表; 信号量=新信号量lim5; 添加任务; } 私有任务{ tasks.AddRange 项目 .其中x=>x.InProcess==false 。选择异步项=>{ 等待信号量。等待异步; 尝试 { 等待工作项; } 捕获系统。异常 { 投 } 最后{ 信号量释放; } } .托雷 ; } }
但我认为这不会正确工作,因为信号量在任务内部。如何使用信号量作为LINQ查询的一部分来暂停生成新任务,直到等待信号量为止?

您可以尝试以下代码。它应该像你期望的那样工作,但我还没有试过。不要忘了调用wait Task.WhenAlltasks,当它完成时,您需要得到结果

private void AddTasks()
    {
        tasks.AddRange(items
                       .Where(x => x.InProcess == false)
                       .Select(AddTaskAsync)
                       .ToArray());

        //later await Task.WhenAll(tasks);
    }

    private async Task AddTaskAsync(YourClass item)
    {
        await semaphore.WaitAsync();
        try
        {
            await DoWork(item);
        }
        finally
        {
            semaphore.Release();
        }
    }

我的示例代码实现了我的预期。在任务内部使用信号量不会导致任何问题。它阻止了任务的运行,这就是目标。

您的最终目标是什么?@stuartd Parallel.ForEach用于同步CPU限制的操作,而不是异步操作。我考虑过Parallel.ForEach,但我的实际工作是大量I/O,CPU工作很少,再加上@Servy所说的。我最初从Task.Run开始生成任务,但发现这种方法更简洁。项目列表可能有数百个,因此我想限制正在生成的任务的数量,这样我就不会耗尽任何线程。如果您想知道代码是否能正常工作,请尝试一下,看看它是否能正常工作。不管它是否运行,以及它运行时会发生什么,都将帮助您找出需要从这里走到哪里。这样我就不会让任何线程饿死——通常,您可以信任线程池来做正确的事情。几百个任务并不多,特别是如果它们是基于异步I/O的任务。我会先试试不节流的方法,看看是否合适。如果您想使用节流,那么您的代码是正确的。AddTaskAsync的名称有点误导,因为在中创建的任务没有添加到任何地方。该方法的更好名称可以是DoWorkAsync。