【发布时间】:2019-07-29 04:19:38
【问题描述】:
我有一个 web api 方法:-
[POST]
public void SaveData()
{
}
我想以这样一种方式实现,如果 SaveData() 方法中的代码已经被执行,那么 SaveData 方法将不接受任何其他调用。
即我想在队列中保留对 savedata 方法的调用。 当一个呼叫结束时,另一个呼叫将发生。
注意:- 调用 SaveData() 方法不在我的范围内。我无法决定是同步还是异步调用这个 api 方法。
在我的范围内,唯一的事情就是为 SaveData 方法编写代码。它将被称为彻底的外部系统。
【问题讨论】:
-
您使用的是网络农场还是网络花园?
-
您是否在应用程序中使用队列系统(例如 RabbitMQ 或 SQS)?
-
没有。不使用任何提到的
-
在这种情况下,将
static object bob = new object();放在你的类中,然后在SaveData中使用lock (bob)。这是最简单的解决方案(尽管这意味着您的其他请求将被阻止)。探索的另一种方法是使用BlockedCollection(使用一个单独的线程一次读取一个)。 -
@mjwills 我不确定您的解决方案是否会将请求“排队”并且在释放锁定时它们将保持相同的顺序。此外,您对队列系统的想法在这里看起来像是一个答案。只需尽可能快地将任务放入
SaveData操作中的队列中。使用排队的任务 ID 立即响应也可能是一个好方法。
标签: c# .net asp.net-web-api