我有一个Web服务,我需要确保完成处理然后在调用onstop()时退出。目前,当调用onstop()时,服务立即停止。我被告知要查看ManualResetEvent和一个requeststop标志。我到处寻找一些例子,甚至找到了其中一些:
How do I safely stop a C# .NET thread running in a Windows service?
To make a choice between ManualResetEvent or Thread.Sleep()
http://www.codeproject.com/Articles/19370/Windows-Services-Made-Simple
但是我很难理解哪一种最适合我的情况。
以下代码:
System.Timers.Timer timer = new System.Timers.Timer();
private volatile bool _requestStop = false;
private static readonly string connStr = ConfigurationManager.ConnectionStrings["bedbankstandssConnectionString"].ConnectionString;
private readonly ManualResetEvent _allDoneEvt = new ManualResetEvent(true);
public InvService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
_requestStop = false;
timer.Elapsed += timer_Elapsed;
double pollingInterval = Convert.ToDouble(ConfigurationManager.AppSettings["PollingInterval"]);
timer.Interval = pollingInterval;
timer.Enabled = true;
timer.Start();
}
protected override void OnStop()
{
_requestStop = true;
timer.Dispose();
}
protected override void OnContinue()
{ }
protected override void OnPause()
{ }
private void timer_Elapsed(object sender, EventArgs e)
{
if (!_requestStop)
{
timer.Start();
InvProcessingChanges();
}
}
private void InvProcessingChanges()
{
//Processes changes to inventory
}
有没有人有经验可以帮助我的Windows服务? 刚刚完成我的第一次工作服务,我对Windows服务很陌生。此服务需要在实际停止之前完成发送库存更新。
答案 0 :(得分:3)
您使用类似ManualResetEvent
之类的内容,等到事件进入信号状态后才能完成Stop
。考虑到您尝试在同一过程中发出信号,ManualResetEventSlim
可能更合适。
基本上,您可以在停止期间和处理来电Wait
时为活动致电Reset
,当您完成后,请致电Set
。
e.g。
private ManualResetEventSlim resetEvent = new ManualResetEventSlim(false);
public void InvProcessingChanges()
{
resetEventSlim.Reset();
try
{
// TODO: *the* processing
}
finally
{
resetEvent.Set();
}
}
public void WaitUntilProcessingComplete()
{
resetEvent.Wait();
}
并根据您的服务:
protected override void OnStop()
{
WaitUntilProcessingComplete();
}