当有人在另一个线程上运行时,是否有人知道如何停止Console.ReadLine方法?
现在我使用的代码(循环部分)就像这样:
while (true)
{
while (!Console.KeyAvailable) Thread.Sleep(100);
string line = Console.ReadLine();
}
它确实有效,但问题是只要输入一个字符,服务器就不会关机。
有人知道如何实现这个目标吗? (完全不同的方法也欢迎,只要它允许我在调用Start()方法后读取控制台行,并且它在Stop()方法调用之后停止。)
答案 0 :(得分:3)
Console.ReadLine
在内部调用TextReader.ReadLine
。如果底层流已关闭,则退出。如果从主线程中调用Console.In.Close()
它可能会起作用,或者您可能无法关闭控制台输入流。试试吧,看看。
忘掉它,Console.In.Close()似乎是一个无操作。
<强>更新强>
这篇文章提供了各种非常相似的方法:How to add a Timeout to Console.ReadLine()?
(删除代码,因为它不起作用)
另一次更新
我做了更多研究,这就是我发现的:
控制台处于线路模式。
在调用Read,ReadLine或Peek之前,用户无法以行模式输入文本。
读取,ReadLine和Peek阻止,直到用户按下Enter键。
因此我们不能让控制台处理行输入或我们遇到阻塞问题。
所以我们必须自己使用KeyAvailable和ReadKey并管理删除等
本文有一个处理ReadKey输入的示例:http://msdn.microsoft.com/en-us/library/system.consolekeyinfo.keychar.aspx
如果修改此函数以在调用ReadKey之前始终调用KeyAvailable并在没有输入时暂时休眠,则可以避免阻塞。
答案 1 :(得分:2)
为运行此循环的线程将IsBackground属性设置为true。这应该允许CLR干净地关闭应用程序。
答案 2 :(得分:1)
使用KeyAvailable和ReadKey代替ReadLine。或者可能在控制台消费者线程上调用Thread.Abort。