我有一个运行很多次的while循环。我在那里有一些用作调试语句的writelines。我使用详细程度标志来确定何时查看写入控制台的语句。有没有办法我也可以指定每隔x毫秒输出一次,而不是一直输出。
while
{
//logic here
if(verboseMode)
Console.Writeline("some status message")
}
使用代码现在的方式,当verboseMode设置为true时,writeline始终执行。如果verboseMode设置为true而上次输出的内容是x毫秒之前,我想做的就是输出行
答案 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次更改,无论如何都可以达到最佳的写入/更新速度。