2011-03-10 23 views
0

有人知道如何在不同的线程上运行时停止Console.ReadLine方法吗?Stoppble控制台在不同线程上读取

现在我用的是这样的一个代码(它的循环部分):

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

它的工作,但问题是,当我输入一个字符,服务器赢得不要关机。

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

回答

1

将IsBackground属性设置为true对于运行此循环的线程。这应该允许CLR干净地关闭应用程序。

+0

我不想关闭应用程序,我想停止阅读。而且我知道IsBackground属性,但它是否也适用于中止?还是只关闭? – Aidiakapi 2011-03-10 16:45:10

1

使用KeyAvailable和ReadKey替代ReadLine。或者可能调用控制台消费者线程上的Thread.Abort。

+0

尝试过,并将其存储到列表中,然后将其转换为字符串。没有工作得太好,退后崩溃,所以你能给我提供一个这样的例子吗? – Aidiakapi 2011-03-10 16:54:51

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

如果你修改这个功能随时拨打KeyAvailable在调用ReadKey并暂时休眠之前,如果没有输入,则可以避免阻塞。

+0

试过了,但我不知道如何重新启动它......然后......你知道吗? – Aidiakapi 2011-03-10 17:01:34

+0

如果您希望一个线程从Console.In分离,另一个线程要启动并重新附加,您将如何同步输入?如果第一台服务器读取了一行的一部分,则第二台服务器将看不到它。 – arx 2011-03-10 17:05:19

+0

不,我的意思是,这是一个服务器,你只能在某些时刻输入数据。 – Aidiakapi 2011-03-10 17:06:55