c# - 如何中断 Console.ReadLine

标签 c# .net multithreading console

是否可以通过编程方式停止 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/

相关文章:

c# - System.InvalidOperationException 由于调用 Application.Exit() 时的集合修改

c# - System.Web.Routing.RouteCollection.GetRouteData 中的异常

C# .NET + PostgreSQL

c# - 单个 Windows 线程的内存开销是多少?

c# - 对 RegEx 帮助不大

.net - 我仍然可以在 Visual Studio 2010 中以 .NET Framework 2.0 为目标吗?

.net - 为 .Net Framework 4.0 构建的 WIX 自定义操作不起作用?有什么办法解决?

c# - 在 .Net 中获取 CryptoStream 的长度

c++ - 带线程的后台函数c++

c# - volatile 与 volatile 读/写?