【问题标题】:Stoppable console reading on different thread不同线程上的可停止控制台读取
【发布时间】:2011-03-10 16:39:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: c# multithreading console


【解决方案1】:

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 并在没有输入时短暂休眠,则可以避免阻塞。

【讨论】:

  • 试过了,但我不知道如何重新启动它......你知道吗?
  • 如果您希望一个线程从 Console.In 中分离,而另一个线程启动并重新连接,您将如何同步输入?如果第一个服务器读取了一行的一部分,那么第二个服务器将看不到它。
  • 不,我的意思是,它是用于服务器的,您只能在某些时刻输入数据。
  • 我说的对吗?您实际上并不需要在单独的线程上输入;您只是在寻找控制台输入的可中断等待?
  • 这里有很多方法可以做到这一点:stackoverflow.com/questions/57615/…
【解决方案2】:

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

【讨论】:

  • 我不想关闭应用程序,我想停止阅读。我知道 IsBackground 属性,但它也适用于中止吗?还是只是为了关机?
【解决方案3】:

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

【讨论】:

  • 试过了,并将其存储到列表中,然后将其转换为字符串。效果不太好,退格会崩溃,所以你能给我提供一个可行的例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多