• 常用
  • 百度
  • google
  • 站内搜索

数码

SemaphoreSlim,在.NET中用于限制资源并发访问数量的工具

  • 更新日期:2025-11-27
  • 查看次数:166

SemaphoreSlim通过许可证机制限制并发数,如示例中最多3个线程同时访问资源:初始化指定最大并发数,线程调用WaitAsync()获取许可证,使用后Release()释放,避免阻塞或死锁,适用于控制数据库连接、任务并行等场景。

.NET中的SemaphoreSlim是什么?如何限制对资源的并发访问数量?

SemaphoreSlim 是 .NET 中用于控制对有限资源的并发访问数量的轻量级同步原语。它允许多个线程进入,但限制同时运行的线程总数,适用于需要控制并发度的场景,比如限制数据库连接数、控制任务并行数量等。

基本原理

SemaphoreSlim 类似于“许可证”机制:初始化时指定最大并发数(即许可证总数)。线程在访问资源前必须先获取一个许可证,使用完后再释放。如果所有许可证都被占用,后续线程将被阻塞或等待,直到有线程释放许可证。

如何使用 SemaphoreSlim 限制并发访问

以下是一个典型的使用示例,展示如何限制最多 3 个线程同时访问某个资源:

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    // 最多允许 3 个线程同时访问
    private static SemaphoreSlim _semaphore = new SemaphoreSlim(3);

    static async Task Main()
    {
        var tasks = new Task[10];
        for (int i = 0; i < 10; i++)
        {
            int id = i;
            tasks[i] = Task.Run(() => AccessResource(id));
        }

        await Task.WhenAll(tasks);
    }

    static async Task AccessResource(int id)
    {
        Console.WriteLine($"线程 {id} 正在等待进入...");

        // 等待获取许可证
        await _semaphore.WaitAsync();

        try
        {
            Console.WriteLine($"线程 {id} 进入,开始执行。");
            await Task.Delay(1000); // 模拟工作
        }
        finally
        {
            // 释放许可证
            _semaphore.Release();
            Console.WriteLine($"线程 {id} 退出,释放资源。");
        }
    }
}

关键方法说明

  • WaitAsync():异步等待获取一个许可证。推荐在异步编程中使用,避免阻塞线程。
  • Release():释放一个许可证,允许其他等待的线程进入。
  • Wait():同步方式获取许可证,会阻塞当前线程。

常见应用场景

  • 限制并发 HTTP 请求数量,防止对远程服务造成压力。
  • 控制文件读写操作的并发数,避免资源争用。
  • 在后台任务处理中,限制同时处理的任务数量以节省系统资源。
基本上就这些。SemaphoreSlim 轻量、支持异步,是控制并发访问的有效工具。注意在使用后及时调用 Release(),否则可能导致死锁或资源无法释放。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

imtoken下载 im钱包 imtoken imtoken 快连官网 imtoken imtoken imtoken imtoken imtoken wallet imtoken imtoken官网 imtoken钱包 imtoken下载 imtoken官网 imtoken钱包 imtoken安卓下载 imtoken下载 imtoken官方下载 imtoken官网 imtoken安卓下载 imtoken下载 imtoken下载 imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken bitget wallet telegram下载 quickq VPN trust wallet v2rayn imtoken