为什么控制台暂停我的代码当我点击滚动条
本文关键字:滚动条 代码 控制台 暂停 我的 为什么 | 更新日期: 2023-09-27 18:06:20
在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);
}
该源代码应该打印出一些稳定的数字,如
- … 62.234235 62.123134 62.589342 62.423423
- …
当它运行时,按住滚动按钮几秒钟。当你按住按钮时,输出应该停止,因为线程正在睡眠....
u释放后的下一个输出是smt。这样的:
- … 62.234235
- 62.123134 <—按住滚动按钮
- 2540.342112 <—释放 62.589342 62.423423
- …
不行,不行。
Console.WriteLine
为阻塞操作当您滚动时,您正在阻止此调用完成,但秒表继续运行。
当你释放滚动时,你看到的数字基本上是50 +你保持滚动按钮的时间
您可以创建一个:
ConcurrentQueue<float> deltasQueue;
然后,启动第二个后台线程执行代码,但不是执行Console.WriteLine(delta),而是将delta插入到deltasQueue中。
你的主线程,在启动后台线程之后,应该有一个循环,当项目到达时从deltasQueue中取出,并与它们一起执行Console.WriteLine(delta)。
这样,生成增量的代码就可以在不阻塞的情况下运行。只有显示它们的主线程才会阻塞。当用户停止滚动时,控制台将突然赶上并打印在他们滚动时发生的所有增量。按住滚动条会阻碍UI执行任何代码。因此您的程序正在暂停。
当你发布时,代码运行,你得到你的打印时间。