我正在制作一个测试控制台应用程序。这个应用程序运行一个void任务(我无法改变这个事实),为了让它保持打开状态,我Console.ReadLine
在 Main 方法的末尾插入。
有没有办法消耗从其他线程按下的每个键?我尝试了以下方法,但对 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();
}
我想要的基本上是在另一个线程上有一个键盘按键事件监听器。
我还尝试了全局键盘挂钩,但这不适用于控制台应用程序。