2015-11-05 58 views
1

我有一個依賴於REST服務的ASP.NET應用程序(MVC 4,C#)。一個服務應該是一個緩慢的服務(我們不確定它會在第一次或第二次調用後返回正確的結果)。所以我必須在一定的延遲中多次調用它,直到狀態爲Success或循環結束。多次調用相同的服務有延遲

這個調用實際上是後端調用序列的一部分。在這些操作過程中用戶不能做任何事情(他應該等待)。所以沒有辦法從客戶端改進這個問題。我認爲使用SignalR等是沒有道理的。

這是一個不使用Azure的商業而非開源的多用戶應用程序。

您能否就此類問題的最佳做法給我建議?

有關問題

示例代碼(只是一個樣本,以顯示邏輯是的,我知道了Thread.Sleep在服務器端的東西真的不好。):

  int count = 0; 
      while (count < 10) 
      { 
       Thread.Sleep(3000); 
       result = CallService(); 
       if (result != null && result.State == ServiceState.Success) 
        return true; 
       count++; 
      } 

更新:一會兒我們計劃在JS方面推遲延期。如果你想有沒有JS使用一些漂亮的解決方案,我會很感激的

回答

2

這取決於發生了什麼事情,你沒有給有關的許多細節。一般來說,如果線程將處於空閒狀態,等待下一個調用或者調用Web服務的響應,那麼您需要異步處理它。這將允許線程在空閒期間返回到池,以便您的服務器不會耗盡空閒線程和死鎖。

但是,請記住,使用異步不會使任何事情發生得更快,並且在所有工作完成之前,操作將無法返回響應。因此,客戶可能會長時間等待迴應。

將工作轉移到後臺任務可能會更好,然後通過使用AJAX進行長輪詢或在服務器上使用類似SignalR的Web套接字來不時進行檢查,側。請記住,我是而不是談論關閉一個新的線程。這在網絡請求的上下文中什麼都不做,並且實際上會創建一些對您的網站性能有害的問題。您需要一個真正的藍色後臺處理解決方案,比如Azure空間中的Web工作人員,或者需要Hangfire的傳統IIS託管解決方案。

+0

的時刻,我會添加更多的細節 –