首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使windows服务请求等待上一次请求完成

如何使windows服务请求等待上一次请求完成
EN

Stack Overflow用户
提问于 2014-07-15 08:51:55
回答 1查看 2.7K关注 0票数 1

我正在处理一个窗口服务应用程序,我的窗口服务将在一定的时间间隔内调用其中一个web服务(例如,3分钟)。从web服务中,我将从数据库中获取数据,并使用这些数据发送电子邮件。

如果我的db表中有大量的行,那么发送邮件需要一些时间。这里我有一个问题:窗口服务发送第一个请求,它将处理一些记录集。因此,在web服务处理它时,窗口服务在完成第一个请求之前向web服务发送另一个请求。因此,每当web服务收到来自windows服务的新请求时,它都会一次又一次地从db获得相同的记录。

有谁能建议我如何锁定之前的请求,直到它完成它的工作或其他方式来处理这种情况?

Web服务调用:

代码语言:javascript
复制
protected override void OnStart(string[] args) 
{ 
   timer.Elapsed += new ElapsedEventHandler(OnElapsedTime); 
   timer.Interval = 180000; 
   timer.AutoReset = false; 
   timer.Enabled = true; 
}

内部方法

代码语言:javascript
复制
        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 
            {

            }
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-16 06:32:17

监视器类对于这个场景非常有用。下面是如何使用它的一个示例:

代码语言:javascript
复制
// 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也存在过载,允许您指定输入区段的超时。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24753799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档