c# - 如何从一个线程使用 Console.ReadLine 并从另一个线程使用 ConsoleKeys?

标签 c# multithreading console console-application console.readline

我正在制作一个测试控制台应用程序。该应用程序运行一个 void 任务(我无法更改这一事实),为了使其保持打开状态,我在 Main 方法末尾插入 Console.ReadLine

有没有办法消耗从其他线程按下的每个键?我尝试了以下操作,但对 Peek 的调用阻塞了线程。

loop = Task.Run(async () =>
{
    var input = Console.In;
    while (running)
    {
        int key = input.Peek(); // blocks here forever
        if (key == -1)
        {
            await Task.Delay(50);
        }
        else
        {
            input.Read();
            if ((ConsoleKey)key == ConsoleKey.Enter)
            {
                Completed?.Invoke();
            }
            else
            {
                OnKeyDown((ConsoleKey)key);
            }
            // todo how to intercept keyup?
        }
    }
});

这是主要方法

static void Main(string[] args)
{
    GrpcEnvironment.SetLogger(new Grpc.Core.Logging.ConsoleLogger());

    //setup MagicOnion and option.
    var service = MagicOnionEngine.BuildServerServiceDefinition(isReturnExceptionStackTraceInErrorDetail: true);

    var server = new global::Grpc.Core.Server
    {
        Services = { service },
        Ports = { new ServerPort("localhost", 12345, ServerCredentials.Insecure) }
    };

    // launch gRPC Server.
    server.Start();

    // and wait.
    Console.ReadLine();
}

我想要的基本上是在另一个线程上有一个键盘按键按下事件监听器。


我也尝试过global keyboard hooks但这不适用于控制台应用程序。

最佳答案

我决定将其而不是 Console.ReadLine 放在 Main 方法的末尾。

while (true) Task.Delay(1000).Wait(); // console.ReadLine doesn't let us to read from console in other threads.

然后我就可以了

loop = Task.Run(() =>
{
    while (running)
    {
        var key = Console.ReadKey(true).Key;
        if (key == ConsoleKey.Enter)
        {
            Completed?.Invoke();
        }
        else
        {
            OnKeyDown(key);
        }
        // todo how to intercept keyup?
    }
});

按 Enter 键,我们的应用程序不会关闭,但这是一个测试应用程序,按 Enter 键退出不是我们的要求。

但是如果有人仍然知道 Console.ReadLine 的答案,我很高兴知道它。

关于c# - 如何从一个线程使用 Console.ReadLine 并从另一个线程使用 ConsoleKeys?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54394832/

相关文章:

c# - 如何在按钮悬停时在面板周围绘制边框?

c# - 向Access数据库添加记录时"Syntax error in INSERT INTO statement"

multithreading - Haskell 对 Node.js 的响应是什么?

c - 有没有办法从同一进程中的另一个线程查看一个线程的寄存器内容?

c# - "The process cannot access the file because it is being used by another process "

c# - 验证在运行时从 URI 加载的 WPF 位图图像

C#:从后台线程访问 datagridview1

c++ - 通过控制台传递非整数输入

java - 有谁知道如何在 Eclipse 中为 java 分隔控制台文本

c++ - 是否可以拦截来自另一个进程的控制台调用?