让单个线程窗口服务睡眠15分钟的最佳方法

时间:2015-08-09 16:05:27

标签: c# .net vb.net

我有一个单线程VB.net服务,它检查数据库中的特定信息。如果信息不存在,则需要等待15分钟再试一次。在这15分钟的时间内,服务等待的最佳方法是什么?我认为使用threading.thread.sleep进行Do循环,但我总是在阅读使用它的方法,但我不知道其他选择。对此更好的方法的任何建议将不胜感激。

2 个答案:

答案 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);
        }
    }
}

使用这个课程,你的计时器可以停留一段时间,也可以在睡眠时间内被唤醒。

我希望这会有所帮助。