gpt4 book ai didi

c# - 不同线程上的可停止控制台读取

转载 作者:太空宇宙 更新时间:2023-11-03 19:30:31 25 4
gpt4 key购买 nike

有人知道如何停止 Console.ReadLine 方法,当它在不同的线程上运行时吗?

现在我使用的代码(它的循环部分)是这样工作的:

while (true)
{
while (!Console.KeyAvailable) Thread.Sleep(100);
string line = Console.ReadLine();
}

它确实有效,但问题是只要我输入一个字符,服务器就不会关闭。

有人知道如何实现吗? (也欢迎使用完全不同的方法,只要它允许我在调用 Start() 方法后读取控制台行,并在 Stop() 方法调用后停止。)

最佳答案

Console.ReadLine 在内部调用 TextReader.ReadLine。如果底层流关闭,这将退出。如果您从主线程调用 Console.In.Close() 它可能会起作用,或者您可能无法关闭控制台输入流。试试看。

算了,Console.In.Close() 似乎是空操作。

更新

这篇文章有各种各样的方法来做一些非常相似的事情:How to add a Timeout to Console.ReadLine()?

(删除代码,因为它不起作用)

另一个更新

我做了更多的研究,这是我的发现:

  • 控制台处于线路模式。

  • 在调用 Read、ReadLine 或 Peek 之前,用户无法以行模式输入文本。

  • Read、ReadLine 和 Peek 会阻塞,直到用户按下 Enter。

  • 因此我们不能让控制台处理线路输入,否则我们会遇到阻塞问题。

  • 所以我们必须自己使用KeyAvailable和ReadKey以及管理删除等

这篇文章有一个处理 ReadKey 输入的例子:http://msdn.microsoft.com/en-us/library/system.consolekeyinfo.keychar.aspx

如果您修改此函数以始终在调用 ReadKey 之前调用 KeyAvailable 并在没有输入时短暂休眠,则可以避免阻塞。

关于c# - 不同线程上的可停止控制台读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5262817/

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