我有一个.NET 6 API端点,它创建很少的独立资源并修改共享资源,但是每当有并发HTTP请求时,API在修改共享资源时面临竞争条件,导致意外结果,共享资源是外部资源我无法控制,在应用程序/API 级别锁定此资源并使并发请求等待锁定释放的最佳方法是什么?
PS:我没有定义任何显式的多线程;将其视为一个普通的 .NET 6 API,带有一堆创建/修改资源的异步等待方法
如果“共享资源”在应用程序实例内共享,那么您可以使用
SemaphoreSlim
进行互斥。当你的代码进入其临界区时,它会执行一个 await semaphore.WaitAsync();
;当它退出其临界区时,它会执行一个 semaphore.Release();
(通常在 finally
内)。
如果“共享资源”是外部的,即在多个应用程序实例之间共享,那么您需要使用 CosmosDb 或 Redis 等构建分布式租赁系统。