我有这种情况下,我有一个WebApi和一个端点,当被触发时做了很多工作(大约2-5分钟)。这是一个带有副作用的POST端点,我想限制执行,以便如果发送2个请求到这个端点(不应该发生,但是比对不起更安全),其中一个请等待以避免竞争条件。如何在WebApi操作中锁定长时间的异步调用
我第一次尝试使用一个简单的静态锁控制器内是这样的:
lock (_lockObj) 
{ 
  var results = await _service.LongRunningWithSideEffects() 
  return Ok(results) 
} 
这是因为lock语句内await的当然是不可能的。
我考虑的另一个解决方案是使用一个SemaphoreSlim实现这样的:
await semaphore.WaitAsync() 
try 
{ 
  var results = await _service.LongRunningWithSideEffects() 
  return Ok(results) 
} 
finally 
{ 
  semaphore.Release() 
} 
然而,根据MSDN:的SemaphoreSlim类表示可用于重量轻,快速旗语等待时间在之间,等待时间预计会很短。
由于在这种情况下,等待时间甚至可能会达到5分钟,我应该如何使用并发控制
我明白,通过此任务到服务可能是最佳的方式,但是,我不一定要排队在仍然运行在后台的东西请求完成后。 该请求涉及需要一些时间的其他请求和集成,但我仍然希望用户等待此请求完成并获得响应。 这个请求预计只能在特定时间每天由cron作业触发一次。但是,也有一个选择可以由开发人员手动触发它(主要是为了防止作业出现问题),并且我想确保如果开发人员(例如,开发人员)不会遇到并发问题偶然发送请求等。