当.NET中的另一个线程正在执行Console.ReadLine时,如何中止该线程

本文关键字:线程 ReadLine 何中止 Console NET 另一个 执行 | 更新日期: 2023-09-27 18:21:27

我的控制台应用程序正在执行一个完全用于用户界面的线程,它在Console.ReadLine()上花费了大量时间进行阻塞(此调用在Windows内部,在.NET框架的控制之外)。

我需要中止这个线程。然而,以下代码似乎不起作用:

this.UserInterfaceThread.Abort();

有什么想法吗?Thread.Interrupt()有用吗?

更新

正如Hans Passant所指出的:

CLR在中止线程时对其状态强加了相当合理的规则。thread.Artrt()的危险是众所周知的,当然永远无法可靠工作的是中止正在执行非托管代码的线程。当您调用Console.ReadLine()时,线程就会深深地隐藏在Windows操作系统代码中。

解决方案是简单地将[enter]键插入当前运行的控制台应用程序中,该应用程序会解除console.ReadLine()的锁定,因此线程会立即中止。

我们不能使用SendKeys,因为这是特定于windows窗体的,而且它还需要当前窗口具有焦点。

解决方案是使用inputsimulator.codeplex.com上的库,该库封装了Windows SendInput()调用。

参见示例代码:

.NET调用将[enter]击键发送到当前进程,这是一个控制台应用程序?

当.NET中的另一个线程正在执行Console.ReadLine时,如何中止该线程

CLR在线程中止时对其状态强加了相当合理的规则。thread.Artrt()的危险是众所周知的,中止执行非托管代码的线程肯定是不可靠的。当您调用Console.ReadLine()时,线程就会深深地隐藏在Windows操作系统代码中。

你将不得不采取不同的做法。一个显而易见的方法是让这个"用户界面"线程停止程序,而不是相反。可以像"退出"命令或谚语中的"按任意键继续"消息一样简单。

或者将线程的IsBackground属性设置为true。现在您不必中止它,当Main()方法退出后,Windows关闭进程时,它会终止它。

使用SendKeys并模拟ENTER键。在这里寻求帮助。

祝你好运。

我刚刚测试过它,Thread.Abort()Thread.Interrupt()都不能在调用Console.ReadLine()的线程上工作,即使是通过StreamReader( new BufferedStream(...))调用它。

我甚至试着给Console.In.Close()Dispose()打电话。似乎一旦你进入阅读,你就真的进入了阅读;奇怪的是,这似乎打破了溪流的设计。

看起来你唯一的选择就是使用@Darin Dimitrov 提到的答案

编辑:从列表中删除了另一个:尝试调用win32 api FreeConsole。从Console.ReadLine()调用中引发内存损坏异常。