2

5 分ごとに正確に実行する方法が必要です。タイマーが徐々に同期しなくなることに気づいたので、タイマーを使用できません (つまり、最終的には 00:01、00:06、00:11、00:16 などに実行されます)。

正確である必要はありますが、あまり正確である必要はありません。5 分 +/- 1 秒ごとに問題はありませんが、何日も実行した後でも、5 分のマークを正確に刻みます。

これまでに考えたことは、DateTime.Now を常にチェックして次の 5 分マークが過ぎたかどうかを確認する 1 秒間隔のタイマーを作成することです。私が見逃した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 分間スリープ状態にすることができます。

これを見てください、それが役立つことを願っています

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 に答える