使用 Task.Run() 时如何限制最大线程数?

Posted

技术标签:

【中文标题】使用 Task.Run() 时如何限制最大线程数?【英文标题】:How can I limit the maximum number of threads when using Task.Run()? 【发布时间】:2020-04-09 10:29:58 【问题描述】:

我想限制最大线程数。我该怎么做?我知道我可以使用类似SetMaximum...如果我使用的是ThreadPool

public async Task ProcessAsync()

    while (true)
    
        Task.Run(Work);
    


async Task Work()

    // some time-consuming job

【问题讨论】:

while (true) 会将Tasks 的数量限制为在某些操作系统资源或其他资源耗尽之前可以运行的数量。是否要限制启动的Tasks 的数量? for (i = 0; i < 10; i++) 会这样做。或者您想限制同时运行的Tasks 的数量?核心数量,还是什么? (或者那个标签应该是.net-core?) 【参考方案1】:

您可以使用 SemaphoreSlim 来限制并发线程的数量。例如一次限制执行 3 个线程:

async Task  Main()

    SemaphoreSlim semaphore = new SemaphoreSlim(3); // Limit to 3 threads
    while (true)
    
        await semaphore.WaitAsync(); // Wait when more than 3 threads are running
        Task.Run(() =>
        
            Work();
            semaphore.Release(); // Work is done, signal to semaphore that more work is possible
        );
    



void Work()

    Console.WriteLine(DateTime.Now);
    Thread.Sleep(3000);

信号量可用于限制多种资源的消耗,但在此示例中,资源是线程池中的一个线程。

【讨论】:

以上是关于使用 Task.Run() 时如何限制最大线程数?的主要内容,如果未能解决你的问题,请参考以下文章

如何限制perl中的最大并行线程数

Task.Run使用默认线程池

修改linux系统用户最大线程数限制

使用异步方法等待 Task.Run 不会在正确的线程上引发异常

如何停止 Task.Run()?

Linux最大线程数限制及当前线程数查询