Я делаю тестовое консольное приложение.Это приложение выполняет задачу 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();
}
, что я хочу, чтобы в основном было нажатой клавишей прослушивания событий на слушателе событийдругой поток.
Я также пытался глобальные клавиатурные хуки , но это не работает для консольного приложения.