可停止的控制台读取不同的线程

时间:2011-03-10 16:39:02

标签: c# multithreading console

当有人在另一个线程上运行时,是否有人知道如何停止Console.ReadLine方法?

现在我使用的代码(循环部分)就像这样:

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

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

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

3 个答案:

答案 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。