我有下面的方法,用于通过 for each 文件创建不同的任务来初始化和启动日志(log)文件处理.在任务管理器中,我可以看到这个函数以这种方式创建了大约100个线程.

public async Task LogProcessing(DescriptorList files, CancellationToken ct)
{
    var tasks = new List<Task>();
    foreach (var file in files)
        tasks.Add(new Task(() =>
        {
            ParsingFile(file, ct);
        }));

    foreach (var task in tasks) { task.Start(); }
   
    await Task.WhenAll(tasks);       
}

How can I prevent creating more threads than the available number of hardware threads?个 谢谢.

推荐答案

如果您使用的是.NET 6.0或更高版本,则可以使用Parallel.ForEachAsync()来执行此操作:

await Parallel.ForEachAsync(
    files,
    new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount, CancellationToken = ct },
    async (file, cancellation) =>
    {
        await Task.Run(() => ParsingFile(file, cancellation), cancellation);
    });

请注意,使用MaxDegreeOfParallelism = Environment.ProcessorCount将并发线程的数量限制为(逻辑)处理器计数.这实际上通常是默认设置,所以您可能根本不需要设置,但有些人可能希望这样做以保持清晰.

根据文档"一般情况下,您不需要修改此设置",但在使用默认设置之前,您应该查看this answer from Theodor Zoulias.(我自己通常不使用默认设置).

我建议阅读the documentation on MaxDegreeOfParallelism,然后自己决定是否指定它.

根据TheodorZoulias下面的 comments ,你可以更简单地写成:

await Parallel.ForEachAsync(
    files,
    new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount, CancellationToken = cancelSource.Token },
    (file, cancellation) =>
    {
        ParsingFile(file, cancellation);
        return ValueTask.CompletedTask;
    });

然而,如果ParsingFile()本身就是async,您当然会使用第一个版本.

Csharp相关问答推荐

有没有方法让ASP.NET Core模型绑定器使用私有设置器来设置属性?

为什么xslWriter不总是按照xslWriterSet中指定的格式格式化该文档?

为什么C#Bigbit不总是相同的比特长度?

System.Text.Json数据化的C#类映射

Microsoft. VisualBasic. FileIO. FileSystem. MoveFile()对话框有错误?

在多对多关系上不删除实体

为什么在使用动态obj+类obj时会调用串联?

Polly重试URL复制值

Google OAuth令牌交换在.Net中不起作用

将操作从编辑页重定向到带参数的索引页

如何避免在.NET中将日志(log)写入相对路径

正在从最小API-InvocationConext.Arguments中检索参数的FromBodyAttribute

未在Windows上运行的Maui项目

类/值和日期的泛型方法

为什么当我try 为玩家角色设置动画时,没有从文件夹中拉出正确的图像?

如何在C#.NET桌面应用程序中动态更改焦点工具上的后退 colored颜色

避免在特定区域中设置Visual Studio代码的自动格式

如何将行添加到DataGrid以立即显示它?

将文本从剪贴板粘贴到RichTextBox时,新文本不会在RichTextBox ForeColor中着色

不寻常的C#语法