我的控制台应用程序正在执行一个完全致力于用户界面的线程,它花费大量时间阻塞Console.ReadLine()
(此调用将时间花在 Windows 内部深处,不受 .NET 框架的控制)。
我需要中止这个线程。然而,下面的代码似乎不起作用:
this.UserInterfaceThread.Abort();
有任何想法吗? Thread.Interrupt() 有什么用吗?
Update
正如汉斯·帕桑特指出的那样:
当 CLR 中止线程时,它会对线程的状态施加相当合理的规则。 Thread.Abort() 的危险是众所周知的,肯定无法可靠地工作的是中止正在执行非托管代码的线程。当您调用 Console.ReadLine() 时就是这种情况,线程被深深地埋藏在 Windows 操作系统代码中。
解决方案是简单地将 [enter] 按键插入当前正在运行的控制台应用程序,这会解除 Console.ReadLine() 的阻塞,因此线程会立即中止。
We cannot使用 SendKeys,因为这是特定于 Windows 窗体的,并且它还要求当前窗口具有焦点。
解决方案是使用位于inputsimulator.codeplex.com它包装了 Windows SendInput() 调用。
参见示例代码:
.NET 调用将 [enter] 击键发送到当前进程,这是一个控制台应用程序?
当 CLR 中止线程时,它会对线程的状态施加相当合理的规则。 Thread.Abort() 的危险是众所周知的,肯定无法可靠地工作的是中止正在执行非托管代码的线程。当您调用 Console.ReadLine() 时就是这种情况,线程被深深地埋藏在 Windows 操作系统代码中。
你必须以不同的方式来做这件事。一个显而易见的方法是让这个“用户界面”线程停止程序,而不是相反。可以像“退出”命令或众所周知的“按任意键继续”消息一样简单。
或者将线程的 IsBackground 属性设置为 true。现在您不必中止它,Windows 将在您的 Main() 方法退出后关闭进程时终止它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)