是否可以通过编程方式停止 Console.ReadLine()
?
我有一个控制台应用程序:大部分逻辑运行在不同的线程上,在主线程中我使用 Console.ReadLine()
接受输入。当分离的线程停止运行时,我想停止从控制台读取。
我怎样才能做到这一点?
最佳答案
更新:此技术在 Windows 10 上不再可靠。请不要使用它。
Win10 中相当大的实现更改使控制台更像终端。无疑是为了协助新的 Linux 子系统。一个(意外的?)副作用是 CloseHandle() 会死锁,直到读取完成,从而终止这种方法。我会保留原来的帖子,只是因为它可能可以帮助其他人找到替代方案。
更新 2:查看 wischi 的答案以获得合适的替代方案。
有可能,您必须通过关闭标准输入流来猛拉地垫。这个程序演示了这个想法:
using System;
using System.Threading;
using System.Runtime.InteropServices;
namespace ConsoleApplication2 {
class Program {
static void Main(string[] args) {
ThreadPool.QueueUserWorkItem((o) => {
Thread.Sleep(1000);
IntPtr stdin = GetStdHandle(StdHandle.Stdin);
CloseHandle(stdin);
});
Console.ReadLine();
}
// P/Invoke:
private enum StdHandle { Stdin = -10, Stdout = -11, Stderr = -12 };
[DllImport("kernel32.dll")]
private static extern IntPtr GetStdHandle(StdHandle std);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(IntPtr hdl);
}
}
关于c# - 如何中断 Console.ReadLine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9479573/