如何使用Timer.Timer(或)如何将循环中的一些代码从当前定时器循环到给定时间?

时间:2016-04-06 10:45:07

标签: c# .net

我必须在指定时间内遍历代码。我使用DateTime

实现了它
var time=DateTime.Now.AddMinutes((Convert.ToDouble(1)));
while(DateTime.Compare(DateTime.Now, time) <= 0)
{
  console.write("some message..")
}

我如何用Timer.Timer或thread.timer实现同样的方法,这是最好的方法..

是否可以每秒写10次? 谁能建议。谢谢

3 个答案:

答案 0 :(得分:1)

    static void Main(string[] args)
    {
        System.Threading.Timer timer = null;
        int counts = 0;
        timer = new Timer((obj) =>
        {
            Console.WriteLine(counts);
            if (++counts > 10)
                timer.Dispose();

        }, null, 100, 100);


        for (;;) ;
    }

将在100ms后每隔100ms调用dosomething()方法 在后台,直到timer.Dispose()被调用; 这个实现将永远不会终止,因为它写在这里;)

enter image description here

答案 1 :(得分:1)

如果您打算完成这项工作,则需要制作程序multithreaded

请参阅System.ThreadingSystem.Threading.Task

一旦你的代码在它自己的线程中执行,(使用线程,任务,定时器或这些命名空间中的任何其他变体)你就可以告诉它在一段时间内停止执行,这个通过调用Thread.Sleep或Task.Delay方法来完成。

e.g。

Task.Run(()=>
{
    do
    {
        //do something
        await Task.Delay(100);
    }
    while(! exitCondition)
});

然而你不应该指望这个准确的时间,因为你正在做的是告诉操作系统这个线程不需要执行那段时间,它不会表示操作系统会在耗尽时立即将其传递给处理器。取决于CPU的繁忙程度,在线程到达等待处理队列的顶部之前可能会有相当长的延迟。如果时间非常重要,那么我会设置较短的时间并在运行前检查时钟

答案 2 :(得分:1)

您始终可以使用StopWatch,这是准确且最适合您的方案的。

Action<long> action = (milliseconds) =>
{
    Console.WriteLine("Running for {0}ms", milliseconds);

    Stopwatch watch = new Stopwatch();
    watch.Start();

    while (watch.Elapsed.TotalMilliseconds <= milliseconds)
    {
        Console.WriteLine("ticks:{0}", DateTime.Now.Ticks);
        Thread.Sleep(100);
    }

    Console.WriteLine("Done");
    watch.Stop();
};

Task.Run(() => action(1000));

enter image description here