为什么控制台暂停我的代码当我点击滚动条

本文关键字:滚动条 代码 控制台 暂停 我的 为什么 | 更新日期: 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执行任何代码。因此您的程序正在暂停。

当你发布时,代码运行,你得到你的打印时间。