【问题标题】:How can I limit the maximum number of threads when using Task.Run()?使用 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?)

标签: c# .net-core async-await task-parallel-library threadpool


【解决方案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);
}

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

【讨论】:

    猜你喜欢
    • 2018-08-04
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 2012-02-17
    • 2016-09-22
    • 2020-07-18
    • 1970-01-01
    • 2016-08-25
    相关资源
    最近更新 更多