管理特定Web服务上的调用队列

时间:2014-06-21 12:03:21

标签: c# multithreading web-services asp.net-web-api

我正致力于使用RESTFul WebAPI服务与服务器通信的移动应用程序,这要归功于服务器上运行的.NET WebApi程序。该应用程序是关于添加和销售产品。在每次销售产品时,我们在数据库中对库存产品的总量进行-1。 该应用程序将被许多用户使用,并且如果产品库存足够,所有用户将能够同时销售相同的产品。为了销售产品并将其从库存中取出,我需要确保该产品仍然可用。由于许多用户可以同时销售它,我需要在该webservice上创建一个等待队列,该队列将检查是否有其他请求在触发请求之前等待和处理,以避免交易错误,例如产品不再可用但卖出是在知道之前完成的。 有人知道如何在Web服务上创建等待队列吗?这是关于线程还是什么?

理论上,我认为最好的解决方案是,每次销售产品时,我们都会将请求放在另一个线程中,这个线程将被放在另一个线程中,并在其他线程完成后执行并执行(在数据库中)该产品可用于当前销售。

但我不知道该怎么做,有人可以建议或帮助我吗?

1 个答案:

答案 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.
}

Learn more about AutoResetEvent in MSDN