我有这种情况下,我有一个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分钟,我应该如何使用并发控制?
EDIT(响应plog17):
我明白,通过此任务到服务可能是最佳的方式,但是,我不一定要排队在仍然运行在后台的东西请求完成后。 该请求涉及需要一些时间的其他请求和集成,但我仍然希望用户等待此请求完成并获得响应。 这个请求预计只能在特定时间每天由cron作业触发一次。但是,也有一个选择可以由开发人员手动触发它(主要是为了防止作业出现问题),并且我想确保如果开发人员(例如,开发人员)不会遇到并发问题偶然发送请求等。
因为评论字数不多的,我在编辑的形式回答,请检查更新的问题。 – valorl