1

我正在一個窗口服務應用程序和我的窗口服務將在特定時間間隔(例如3分鐘)調用Web服務之一。從Web服務中,我將從數據庫獲取數據並使用該數據,我將發送一封電子郵件。
如果我有我的數據庫表龐大的整套行還需要一定的時間間隔發送郵件,在這裏我有問題:如何使Windows服務請求等待,直到前一個請求完成

窗口服務發送第一個請求,它會處理一些集的記錄,以便在通過Web服務處理它時,窗口服務在完成第一個請求之前向Web服務發送另一個請求。 由於這個原因,當Web服務從Windows服務接收到新的請求時,會一次又一次地從數據庫中獲取相同的記錄。

任何人可以建議我如何鎖定先前的請求,直到它完成其工作或其他方式來處理這種情況?

Web服務調用:

protected override void OnStart(string[] args) 
{ 
    timer.Elapsed += new ElapsedEventHandler(OnElapsedTime); 
    timer.Interval = 180000; 
    timer.AutoReset = false; 
    timer.Enabled = true; 
} 

**裏面方法**

使用(MailWebService調用=新MailWebService()){

  try 
      { 
       call.ServiceUrl = GetWebServiceUrl(); 
       System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

       call.CheckMailQueue(); 


      } 
      catch (Exception ex) 
      { 
       LogHelper.LogWriter(ex); 
      } 
      finally 
      { 

      } 
     } 
+0

您能告訴我們您是如何致電網絡服務的嗎?但基本上你需要等待在第一個請求完成的Windows服務,在發送另一個之前... – ChrFin

+0

protected override void OnStart(string [] args) { timer.Elapsed + = new ElapsedEventHandler(OnElapsedTime); timer.Interval = 180000; timer.AutoReset = false; timer.Enabled = true; } 我打電話使用定時器時間間隔的網絡服務 – user3839950

+0

您可以使用代碼格式編輯(和'OnElapsedTime')到您的問題嗎? – ChrFin

回答

2

Monitor類作品非常適合這種情況。下面是如何使用它的一個例子:

// This is the object that we lock to control access 
private static object _intervalSync = new object(); 

private void OnElapsedTime(object sender, ElapsedEventArgs e) 
{  

    if (System.Threading.Monitor.TryEnter(_intervalSync)) 
    { 
     try 
     { 
      // Your code here 
     } 
     finally 
     { 
      // Make sure Exit is always called 
      System.Threading.Monitor.Exit(_intervalSync); 
     } 
    } 
    else 
    { 
     //Previous interval is still in progress. 
    } 
} 

還爲TryEnter過載,使您可以進入的部分指定超時。

+0

謝謝...現在工作 – user3839950