在C#控制台应用程序中运行此代码:
long last = 0;
long curr = Stopwatch.GetTimestamp();
while (true)
{
last = curr;
curr = Stopwatch.GetTimestamp();
var delta = ((curr - last) / (float)Stopwatch.Frequency) * 1000;
Console.WriteLine(delta);
Thread.Sleep(50);
}
此来源应打印出一些稳定的数字,如
在此过程中按住滚动按钮几秒钟。当你按住按钮时,输出应该停止,因为线程正在睡觉....
你发布时的下一个输出是smt。像这样:
现在我的问题: 当我滚动时,有没有办法阻止控制台告诉我的线程一个晚安故事?
答案 0 :(得分:3)
不,没有办法。
Console.WriteLine
是阻止操作。滚动时,您将阻止此调用完成,但秒表继续运行。
释放滚动时看到的数字基本上是50 +你按住滚动按钮多长时间。
答案 1 :(得分:2)
你可以创建一个:
ConcurrentQueue<float> deltasQueue;
然后,启动第二个执行代码的后台线程,但不是执行Console.WriteLine(delta),而是将delta插入deltasQueue。
你的主线程在启动后台线程后,应该有一个循环,当它们到达时从deltasQueue中取出项目,并用它们执行Console.WriteLine(delta)。
这样,生成增量的代码可以无阻塞地运行。只有显示它们的主线程才会阻止。当用户停止滚动时,控制台似乎会突然赶上并打印滚动时发生的所有增量。
答案 2 :(得分:0)
当按住滚动条时,您阻止UI执行任何代码。因此,您的程序暂停。
当您发布时,代码会运行,您可以打印出时间。