2013-09-22 76 views
0

我需要確保Thread.Sleep()將實際運行在我的代碼段上,這是由於API流量速度限制在我所打的第三方API上。我想,最可靠的方式做到這一點是運行同步化處理,而不是異步 - 我已經受理System.Timer,CurrentThread等的想法如何強制Windows服務同步運行而不是異步運行?

問題:什麼是保證線程最可靠的方法.Sleep()阻止進一步執行所有處理,或者一般來說,暫停執行Windows服務的最可靠方法是什麼?我如何確保一個進程同步運行?

+0

_I認爲最可靠的方法是運行進程Synchronously_ - 似乎是一個糟糕的主意。控制對該API的訪問,並讓ASP/IIS做他們的東西。 –

+0

@HenkHolterman我想我只是不遵循 - 這就是我試圖通過實質限制速度(每秒不超過3次調用)來控制對該API的訪問。 –

+0

它可以幫助你確定標題,但現在還不清楚實際問題是什麼。 _ensure Thread.Sleep()命中_是什麼意思?服務是否收到請求?多線程?第二部分仍然是關於ASP.NET。 –

回答

1

任何用戶對您的asp.net應用程序的每個請求都將在其自己的線程中運行。要同步該流量,您可以創建一個單例對象並構建一個使用鎖定的方法。 鎖定將實際鎖定所有線程直到當前線程完成。

所以,如果你看到需要超時,建立一個鎖定塊,並在裏面超時。 現在所有的線程將不得不等待...

像這樣的事情

public class ThreadLock 
{ 
    private static readonly object myLock; 

    public void LockTimeout() 
    { 
     // --> first thread will trigger the following code. 
     // All other threads will wait 
     // <-- HERE 
     // until the first went through 
     lock (myLock) 
     { 
      //... do some timeout work 
     } 
    } 
} 

不管怎麼說,我真的不知道爲什麼你曾經想要做這樣的事情,因爲通常我們都高興具有異步工作的應用程序...反正。希望這會有所幫助

+0

原因是因爲我不得不對我打電話的API施加速度限制(每秒不超過3次)。異步很好,但我試圖確保每秒不超過3個呼叫被超過。 –

+0

在API調用周圍使用時,這可能會起作用。但以3次/秒的速度這個網站不會很好地擴展。 –

+0

@HenkHolterman每秒3個調用只填充我的數據庫。我正在使用API​​來獲取我需要的數據以創建我需要的功能網站。所以,我會讓這個Windows服務運行一個月,到最後,我的數據庫將被填入API的相關數據。這只是一個初步播種。用戶不會遇到這種交互。他們會遇到的是直接與我從API接收的數據庫進行交互。 –