2

我需要一种每 5 分钟准确运行一次的方法。我不能使用 Timer,因为我注意到它会慢慢变得不同步(即它最终会在 00:01、00:06、00:11、00:16 等时间运行)。

虽然它需要准确,但我不需要它太精确。每 5 分钟 +/- 1 秒就可以了,只要经过几天的跑步,它仍然会在 5 分钟标记上准确滴答。

到目前为止,我想到的是创建一个间隔为 1 秒的计时器,它不断检查 DateTime.Now 以查看下一个 5 分钟标记是否已通过。我想知道是否有更优雅的解决方案或我错过的 C# 库中的某些内容。

编辑:我现在有以下模板,可以满足我的要求。

public class ThreadTest
{
    private Thread thread;
    private long nextExecutionTime;
    private long interval;

    public void StartThread(long intervalInMillis)
    {
        interval = intervalInMillis * TimeSpan.TicksPerMillisecond;
        nextExecutionTime = DateTime.Now.Ticks;
        thread = new Thread(Run);
        thread.Start();
    }

    private void Run()
    {
        while (true)
        {
            if (DateTime.Now.Ticks >= nextExecutionTime)
            {
                nextExecutionTime += interval;
                // do stuff
            }
        }
    }
}
4

1 回答 1

0

如果您对 Timer 不满意?

那么你可以尝试让你的线程休眠 5 分钟,而不是使用 Timer

看看这个,希望对你有帮助

using System;
using System.Threading;

public class Worker
{
    // This method will be called when the thread is started.
    public void DoWork()
    {
        while (!_shouldStop)
        {
            Task.Factory.Start(() => 
               {
                    // do you task async
               })
            Thread.Sleep(300000);
        }
    }

    public void DoWork2()
    {
        var watch = new Stopwatch();
        while (!_shouldStop)
        {
            watch.Start();
            Task.Factory.Start(() => 
               {
                    // do you task async
               })

            while(watch.Elapsed.ElapsedMilliseconds < 300000);
            watch.Stop();
            watch.Reset();
        }
    }

    public void RequestStop()
    {
        _shouldStop = true;
    }

    private volatile bool _shouldStop;
}

public class WorkerThreadExample
{
    static void Main()
    {
        // Create the thread object. This does not start the thread.
        Worker workerObject = new Worker();
        Thread workerThread = new Thread(workerObject.DoWork);

        // Start the worker thread.
        workerThread.Start();

        // Loop until worker thread activates.
        while (!workerThread.IsAlive);

        while (true)
        {
            //do something to make it break
        }

        // Request that the worker thread stop itself:
        workerObject.RequestStop();
        workerThread.Join();
    }
}

或者你可以试试这个:

于 2013-04-08T12:27:07.353 回答