随笔 - 750  文章 - 1  评论 - 107  阅读 - 34万

【转】[C#] WebAPI 防止并发调用二(更多)

转自:阿里的 通义灵码

接上篇:https://www.cnblogs.com/z5337/p/18181574

在 C# 中防止接口的并发访问(即确保同一时间内只有一个线程能够访问某个资源或方法),可以通过多种方式实现。这里列出一些常见的方法:

1. 使用 lock 语句

lock 是一种常用的同步原语,用于保护对共享资源的访问。它会获取一个对象的互斥锁,在释放锁之前阻止其他线程获取同一个锁。

复制代码
private readonly object _lockObject = new object();

public void SafeMethod()
{
    lock (_lockObject)
    {
        // 这里是临界区,一次只有一个线程能进入
        // 执行你的业务逻辑
    }
}
复制代码

2. 使用 Monitor 类

Monitor 类提供了比 lock 更加灵活的控制,包括等待条件、超时等。

复制代码
private readonly object _monitorLock = new object();

public void SafeMethod()
{
    Monitor.Enter(_monitorLock);
    try
    {
        // 执行业务逻辑
    }
    finally
    {
        Monitor.Exit(_monitorLock);
    }
}
复制代码

3. 使用 Semaphore 或 SemaphoreSlim

信号量可以用来限制同时访问某个资源的线程数量。

复制代码
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);

public async Task SafeAsyncMethod()
{
    await _semaphore.WaitAsync();
    try
    {
        // 执行业务逻辑
    }
    finally
    {
        _semaphore.Release();
    }
}
复制代码

4. 使用 async/await 和线程安全集合

如果你的方法是异步的,并且需要访问集合,可以考虑使用线程安全的集合,如 ConcurrentBagConcurrentQueueConcurrentStack 等。

复制代码
private readonly ConcurrentBag<int> _threadSafeCollection = new ConcurrentBag<int>();

public async Task SafeAsyncMethod()
{
    // 添加元素
    _threadSafeCollection.Add(1);
    
    // 获取元素
    int value;
    _threadSafeCollection.TryTake(out value);
}
复制代码

5. 使用 ReaderWriterLockSlim

当你有多个读取者但很少有写入者时,ReaderWriterLockSlim 允许多个读取者同时访问资源,但不允许写入者和其他读取者同时访问。

复制代码
private readonly ReaderWriterLockSlim _readerWriterLock = new ReaderWriterLockSlim();

public void SafeReadMethod()
{
    _readerWriterLock.EnterReadLock();
    try
    {
        // 读取操作
    }
    finally
    {
        _readerWriterLock.ExitReadLock();
    }
}

public void SafeWriteMethod()
{
    _readerWriterLock.EnterWriteLock();
    try
    {
        // 写入操作
    }
    finally
    {
        _readerWriterLock.ExitWriteLock();
    }
}
复制代码

选择哪种方法取决于你的具体需求和场景。例如,如果你的应用程序主要是异步的,那么使用 SemaphoreSlim 或 async/await 结合线程安全集合可能是更好的选择。如果你的应用程序是同步的,那么 lock 或 Monitor 可能就足够了。而对于读多写少的场景,ReaderWriterLockSlim 则是一个不错的选择。

posted on   z5337  阅读(170)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2016-09-19 Delete 出错/SQL游标使用
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示