我的控制台应用程序正在等待控制台窗口中的按键。 Console.ReadKey
方法会阻塞,直到有新的键事件可用。但是,由于来自网络连接的数据等其他事件,应用程序也可以继续运行。发生这种情况时,应用程序必须停止收听按键事件,以便后续输入正常工作,例如后续调用Console.ReadLine
。但仍有阻止拨打ReadKey
并且在ReadLine
再次投放之前正在吃下一个按键的电话。
ReadKey
调用已在Task
中运行,因此我可以将其与其他事件一起等待。但是当我想要它时,任务就不会结束。它只会在用户最终按下控制台窗口中的某个键时结束。该密钥可能应该用于下一个读取方法。
我已尝试捕获任务的当前主题并在其上调用Thread.Abort
,但这会导致ThreadAbortedExceptions
出现在其他位置。即使在某处处理它们也无济于事。也许它与某项任务有关,而这项任务并非“正在运行”。但是处于WaitingForActivation
状态。不管它是什么意思。 (老实说,我没有想到处理他们不应该出现的例外情况。只是提到我的绝望行动。)
那么我该怎样做才能中止对Console.ReadKey
方法的阻塞调用?阅读其反编译的实现,它调用ReadConsoleInput
本机函数,该函数会阻塞,直到有一个事件可用。
我无法找到生成或注入此类事件的方法。
我怎样才能最终阻止这个功能的蠢事?
附注:使用Console.KeyAvailable
不是一个选项,因为它会导致忙于等待控制台输入。我已经从Win API的控制台功能的某个地方读到了等待控制台输入事件的某种方式,但这完全没有被托管API覆盖。