gpt4 book ai didi

c# - 如何阻止控制台暂停我的线程和任务?

转载 作者:太空狗 更新时间:2023-10-30 01:18:29 24 4
gpt4 key购买 nike

当我在控制台窗口中使用滚动条时,所有线程和任务都暂停了。有什么方法可以防止这种情况发生吗?

例子:

Task.Run(async () =>
{
for (var z = 0; true; z++)
{
Console.WriteLine(z);
await Task.Delay(200);
}
});

var s = new Thread(() =>
{
for (var z = 0; true; z++)
{
Console.WriteLine(z);
Thread.Sleep(200);
}
});

如果您将这些代码示例中的任何一个作为控制台应用程序运行,两者都会执行相同的操作:打印一些数字。在执行过程中,用鼠标左键按住滚动条一段时间,数字将停止出现。任务/线程已暂停。当您释放鼠标按钮时,数字将继续。

因为滚动条释放后的数字跟在之前的数字后面,所以控制台并没有简单的停止数字的输出。它一直在 Console.WriteLine - 方法中等待,直到我释放滚动条。

有人知道如何解决我的问题吗?

最佳答案

要阻止这种情况,您无能为力。 Console.WriteLine 将在您按住滚动条时阻塞,这与线程或任务完全无关。下面的小程序显示了同样的问题。

using System;
using System.Threading;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
for (var z = 0; true; z++)
{
Console.WriteLine(z);
Thread.Sleep(200);
}
}
}
}

您无法更改 Console.WriteLine 的行为,您唯一可以做的就是在您和写入控制台之间放置一个缓冲区。

using System;
using System.Collections.Concurrent;
using System.Threading;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//The writer lives in another thread.
var s = new Thread(ConsoleWriter);
s.Start();

for (var z = 0; true; z++)
{
//This add call does not get blocked when Console.WriteLine gets blocked.
LinesToWrite.Add(z.ToString());
Thread.Sleep(200);
}
}

static void ConsoleWriter()
{
foreach (var line in LinesToWrite.GetConsumingEnumerable())
{
//This will get blocked while you hold down the scroll bar but
// when you let go it will quickly catch up.
Console.WriteLine(line);
}
}

static readonly BlockingCollection<string> LinesToWrite = new BlockingCollection<string>();
}
}

这只是一个快速而肮脏的解决方案,还有其他方法可以解决这个问题以使其更加透明,例如创建一个派生自 TextWriter 的类,它将缓冲调用并在调用 Console.SetOut( .

关于c# - 如何阻止控制台暂停我的线程和任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27259416/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com