我正致力于使用RESTFul WebAPI服务与服务器通信的移动应用程序,这要归功于服务器上运行的.NET WebApi程序。该应用程序是关于添加和销售产品。在每次销售产品时,我们在数据库中对库存产品的总量进行-1。 该应用程序将被许多用户使用,并且如果产品库存足够,所有用户将能够同时销售相同的产品。为了销售产品并将其从库存中取出,我需要确保该产品仍然可用。由于许多用户可以同时销售它,我需要在该webservice上创建一个等待队列,该队列将检查是否有其他请求在触发请求之前等待和处理,以避免交易错误,例如产品不再可用但卖出是在知道之前完成的。 有人知道如何在Web服务上创建等待队列吗?这是关于线程还是什么?
理论上,我认为最好的解决方案是,每次销售产品时,我们都会将请求放在另一个线程中,这个线程将被放在另一个线程中,并在其他线程完成后执行并执行(在数据库中)该产品可用于当前销售。
但我不知道该怎么做,有人可以建议或帮助我吗?
答案 0 :(得分:1)
似乎可以使用AutoResetEvent
来完成Web服务“队列”。
如果您保护业务逻辑检查的关键代码是否有某些产品的库存,如果有库存,它会从计数器中减去一个,任何尝试输入整个关键代码的线程(请求)都将等到该线程可以输入该代码完成其执行并设置重置事件。
的伪代码:
// This should be declared at your class level and it should be a static field/property
AutoReset autoReset = new AutoResetEvent(false);
// Only one thread will be able to reach the code within this if statement.
// You decide if you want to provide a timeout or you want to wait forever,
// and all threads will wait until one exits the critical code protected by the event
if(autoReset.WaitOne(3000))
{
try
{
// Product selling stuff
}
finally
{
autoReset.Set();
}
}
else
{
// Thread waited 3 seconds. Maybe you should do something in order to prevent users'
// wait time when they want to sell something.
}