gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:56:32 26 4
gpt4 key购买 nike

我正在制作一个测试控制台应用程序。此应用程序运行一个 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?
}
});

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

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com