如何使Windows服务请求等到上一个请求完成

时间:2014-07-15 08:51:55

标签: c# multithreading web-services windows-services synchronization

我正在开发一个窗口服务应用程序,我的窗口服务将以特定间隔(例如3分钟)调用其中一个Web服务。从Web服务我将从数据库获取数据并使用该数据我将发送电子邮件。

如果我在db表中有大量行,则需要一些时间来发送邮件。这里我有问题:窗口服务发送第一个请求,它将处理一些记录集。因此,在通过Web服务处理它时,窗口服务在完成第一个请求之前向Web服务发送另一个请求。 因此,只要从Windows服务收到新请求,Web服务就会一次又一次地从db获取相同的记录。

任何人都可以建议我如何锁定之前的请求,直到完成其工作或其他方式来处理这种情况?

网络服务电话:

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

内部方法

        using (MailWebService call = new MailWebService())
        {

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

                call.CheckMailQueue();


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

            }
        }

1 个答案:

答案 0 :(得分: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也有一个过载,允许您指定输入该部分的超时时间。