在while循环中每x毫秒执行一次操作

时间:2018-02-09 17:35:02

标签: c# .net

我有一个运行很多次的while循环。我在那里有一些用作调试语句的writelines。我使用详细程度标志来确定何时查看写入控制台的语句。有没有办法我也可以指定每隔x毫秒输出一次,而不是一直输出。

while
{
   //logic here
   if(verboseMode)
       Console.Writeline("some status message")
}

使用代码现在的方式,当verboseMode设置为true时,writeline始终执行。如果verboseMode设置为true而上次输出的内容是x毫秒之前,我想做的就是输出行

3 个答案:

答案 0 :(得分:0)

您可以使用计时器或只是跟踪上次写入输出的时间。定时器可能更可取,因为你的主要功能不会阻止它运行而另一个会阻止。

我使用随机来模拟这样一个事实:while循环不会总是以相同的时间运行来证明方法之间的区别。

/* IN MAIN FILE */ 
import Moment from 'moment' 
Moment.locale(lang)
Vue.prototype.$moment = Moment
/* INSIDE A COMPONENT */
console.log(this.$moment().format("LL"))
var r = new Random();
var t = new System.Timers.Timer() { Interval = 1500 };
t.Elapsed += (s, e) =>
    Console.WriteLine(DateTime.Now.TimeOfDay);
t.Start();
while (true)
{
    Thread.Sleep(r.Next(500, 1000));
    Console.WriteLine("doing stuff");
}

答案 1 :(得分:0)

如果您不太关心精度,可以使用Task.Run在不同的线程上运行while循环:

var source = new CancellationTokenSource();

var task = Task.Run(() => 
{
    while (!source.Token.IsCancellationRequested)
    {
        DoSomething();
        await Task.Delay(500, source.Token);
    }
});

// If you want to cancel the loop
source.Cancel();
task.Wait(); // or 'await task;' if you're in an async method

答案 2 :(得分:-2)

你要求的是速率限制。我最初为多线程编写了这段代码,但它应该让你明白:

integer interval = 20;
DateTime dueTime = DateTime.Now.AddMillisconds(interval);

while(true){
  if(DateTime.Now >= dueTime){
    //insert code here

    //Update next dueTime
    dueTime = DateTime.Now.AddMillisconds(interval);
  }
  else{
    //Just yield to not tax out the CPU
    Thread.Sleep(1);
  }
}

请注意,DateTime几乎不是accurate as the type is precise。跟踪的最小差异通常是16毫秒左右。但话说再说一次,16 ms会让你每秒钟进行大约60次更改,无论如何都可以达到最佳的写入/更新速度。