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