使用 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)
会将Task
s 的数量限制为在某些操作系统资源或其他资源耗尽之前可以运行的数量。是否要限制启动的Task
s 的数量? for (i = 0; i < 10; i++)
会这样做。或者您想限制同时运行的Task
s 的数量?核心数量,还是什么? (或者那个标签应该是.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() 时如何限制最大线程数?的主要内容,如果未能解决你的问题,请参考以下文章