c# - 使用 Task.Run() 时如何限制最大线程数?
问题描述
我想限制最大线程数。我该怎么做?我知道我可以使用类似SetMaximum
...如果我使用ThreadPool
.
public async Task ProcessAsync()
{
while (true)
{
Task.Run(Work);
}
}
async Task Work()
{
// some time-consuming job
}
解决方案
您可以使用 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);
}
信号量可用于限制多种资源的消耗,但在此示例中,资源是线程池中的一个线程。
推荐阅读
- python - 将包含列表值的python字典导出到Excel工作表中
- c# - 对于代理对,String.Replace(string,string) Unicode 安全吗?
- java - 矩形没有显示java
- r - 用 7z 读取压缩文件
- javascript - 我如何打开自动日期选择器范围偏离
- xslt - XSLT 对节点的重复元素进行分组并作为请求传递
- android - Firebase 通知,图标和大图像中的小故障
- react-native - 是否可以在 React Native 中设置边距或填充的最小值/最大值?
- php - 如何将array1的每个项目组合项目数组2到PHP中的新数组
- javascript - 为什么 array[array.length] 返回未定义?