webapi怎么長久狀態保持?
我有這種情況下,我有一個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作業觸發一次。但是,也有一個選擇可以由開發人員手動觸發它(主要是為了防止作業出現問題),并且我想確保如果開發人員(例如,開發人員)不會遇到并發問題偶然發送請求等。