首页 > 解决方案 > 使用 Task.Run() 时如何限制最大线程数?

问题描述

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

public async Task ProcessAsync()
{
    while (true)
    {
        Task.Run(Work);
    }
}

async Task Work()
{
    // some time-consuming job
}

标签: c#.net-coreasync-awaittask-parallel-librarythreadpool

解决方案


您可以使用 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);
}

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


推荐阅读