gpt4 book ai didi

c# - 带有 AutoResetEvent 的 Windows 服务

转载 作者:太空狗 更新时间:2023-10-30 01:10:39 25 4
gpt4 key购买 nike

我目前正在构建一个 Windows 服务,该服务需要处理位于数据库表中的消息队列。这个队列的长度可能会有所不同,并且可能需要 5 秒到 55 秒的时间来对数据库中的所有行执行(我目前正在使用 500,000 条记录的测试数据集)

Windows 服务配置为在 30 秒计时器上运行,因此我尝试确保当计时器委托(delegate)运行时它无法再次运行,直到上一个对该方法的请求成功完成

我的 Windows 服务 OnStart 方法中有以下代码:

     AutoResetEvent autoEvent = new AutoResetEvent(false);
TimerCallback timerDelegate = new TimerCallback(MessageQueue.ProcessQueue);

Timer stateTimer = new Timer(timerDelegate, autoEvent, 1000, Settings.Default.TimerInterval); // TimerInterval is 30000

autoEvent.WaitOne();

以及 MessageQueue.ProcessMessage 中的以下代码:

      Trace.Write("Starting ProcessQueue");
SmtpClient smtp = new SmtpClient("winprev-01");

AutoResetEvent autoEvent = (AutoResetEvent)stateObject;

foreach (MessageQueue message in AllUnprocessed)
{
switch (message.MessageType)
{
case MessageType.PlainText:
case MessageType.HTML:
SendEmail(smtp, message);

break;

case MessageType.SMS:
SendSms(message);

break;

default:
break;
}
}

autoEvent.Set();
Trace.Write("Ending ProcessQueue");

我正在使用 DebugView 来分析服务运行时的 Trace 语句 View ,我可以看到“Starting ProcessQueue”的多个实例每 30 秒发生一次,这是我试图避免发生的情况

总结:我想调用 ProcessQueue 并确保它不会再次执行,除非它已完成其工作(这使我能够防止队列中的相同消息被多次处理

我确定我在这里遗漏了一些非常明显的东西,所以我们将不胜感激 :)

戴夫

最佳答案

为什么你不让你的代表禁用计时器,然后在它完成工作后重新启用它(或者继续工作,如果计时器会立即过期)。如果定时器触发和您的代表醒来之间的延迟小于 30 秒,这应该是无懈可击的。

while (true)
{
Trace.Write("Starting ProcessQueue")
stateTimer.Enabled = false;
DateTime start = DateTime.Now;

// do the work

// check if timer should be restarted, and for how long
TimeSpan workTime = DateTime.Now - start;
double seconds = workTime.TotalSeconds;
if (seconds > 30)
{
// do the work again
continue;
}
else
{
// Restart timer to pop at the appropriate time from now
stateTimer.Interval = 30 - seconds;
stateTimer.Enabled = true;
break;
}
}

关于c# - 带有 AutoResetEvent 的 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4203693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com