我有一个单线程VB.net服务,它检查数据库中的特定信息。如果信息不存在,则需要等待15分钟再试一次。在这15分钟的时间内,服务等待的最佳方法是什么?我认为使用threading.thread.sleep进行Do循环,但我总是在阅读使用它的方法,但我不知道其他选择。对此更好的方法的任何建议将不胜感激。
答案 0 :(得分:0)
我想你可以选择Thread.Sleep:
1 - 将您的应用程序设置为SINGLE INSTANCE(请参阅解决方案的属性)。
2-将计划事件添加到Windows的任务计划程序中,每15分钟调用一次应用程序。
3-您的程序将被正常终止,并将从Windows(或由用户手动)调用。
4-从Single-Event开始,你不会同时运行许多应用程序实例 - 只有一个。因此,即使Task Scheduler启动了一个新实例,您也可以确定只运行一个实例。
答案 1 :(得分:0)
使用BackgroundWorker和ManualResetEvent我认为你可以做到你想到的。
public class LibraryBackgroundTimer : BackgroundWorker
{
private ManualResetEvent intervalManualReset;
public int Interval { get; set; }
public LibraryBackgroundTimer()
{
this.WorkerSupportsCancellation = true;
this.Interval = 1000;
}
protected override void OnDoWork(DoWorkEventArgs e)
{
while (!this.CancellationPending)
{
base.OnDoWork(e);
this.Sleep();
}
}
public void Start()
{
if (this.IsBusy)
return;
this.intervalManualReset = new ManualResetEvent(false);
this.RunWorkerAsync();
}
public void Stop()
{
this.CancelAsync();
this.WakeUp();
this.Dispose(true);
}
public void WakeUp()
{
if (this.intervalManualReset != null)
this.intervalManualReset.Set();
}
private void Sleep()
{
if (this.intervalManualReset != null)
{
this.intervalManualReset.Reset();
this.intervalManualReset.WaitOne(this.Interval);
}
}
}
使用这个课程,你的计时器可以停留一段时间,也可以在睡眠时间内被唤醒。
我希望这会有所帮助。