2014-06-21 88 views
0

由於服務器上運行的.NET WebApi程序,我正在使用RESTFul WebAPI服務與服務器進行通信的移動應用程序。該應用程序是關於添加和銷售產品。在每次銷售產品時,我們會在庫存中的該產品的總數量上使用-1。 該應用程序將被許多用戶使用,如果產品庫存充足,所有用戶將能夠同時銷售同一產品。爲了銷售產品並將其從庫存中拿出來,我需要確保產品仍然可用。由於許多用戶可以同時銷售它,所以我需要在該web服務上創建一個等待隊列,以檢查是否有其他請求在發起請求之前等待並處理,以避免產品不再可用等交易錯誤但是在知道它之前賣出了。 有人知道如何在web服務上創建一個等待隊列嗎?這是關於線程還是什麼?管理特定網絡服務上的呼叫隊列

從理論上講,我認爲最好的解決方案是,每次產品銷售時,我們都會將請求放入另一個線程中,並放入另一個線程中,一旦其他線程完成,該產品的庫存(在數據庫中)可用於當前銷售。

但我不知道該怎麼做,可能有人建議或幫助我呢?

回答

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

+0

感謝您的回答,這正是我一直在尋找的! –

+0

@HubertSolecki我很高興聽到!我相信你發現'AutoResetEvent'會爲你打開很多其他用例的大門! ;) –