Como criar um menu de navegação no aplicativo dotne
Criei um aplicativo de console que possui um menu que permite navegar entre os itens de menu. Eu manejo a lógica de navegação neste método:
public virtual void updateMenu()
{
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.UpArrow:
{
if (cursor > 0)
{
cursor--;
Console.Clear();
drawWithHeader();
}
}
break;
case ConsoleKey.DownArrow:
{
if (cursor < (menuItemList.Count - 1))
{
cursor++;
Console.Clear();
drawWithHeader();
}
}
break;
case ConsoleKey.Escape:
{
if (ParentMenu != null)
{
hideMenu();
}
}
break;
case ConsoleKey.Enter:
{
Console.Clear();
drawHeader();
Console.CursorVisible = true;
menuItemList[cursor].Action();
Console.CursorVisible = false;
Console.Clear();
drawWithHeader();
}
break;
default:
{
// Unsuported key. Do nothing....
}
break;
}
}
gora, no Windows, tudo funciona bem, mas quando executo esse aplicativo no meu Linux comsystemd
Eu recebo
Exceção não tratada: System.InvalidOperationException: Não é possível ler a chave quando um aplicativo não possui um console ou quando a entrada do console foi redirecionada. Tente Console.Read.
A exibição do stacktrace:
at System.ConsolePal.ReadKey(Boolean intercept)
at System.Console.ReadKey();
at AppRazen.Menu.ConsoleMenu.UpdateMenu();
Após algumas pesquisas, descobri que esse problema está relacionado aoReadKey()
método não é totalmente compatível com linux. E a solução propostaAqu simplesmente não funciona no meu caso, porque o usuário usouOminSharp
.
Eu também tentei definirReadKey(false)
mas isso não resolveu o problema, e eu também tentei lidar com todas as coisas dentro deUpdateMenu
comConsole.Read()
mas o console parece preso.
Observe que esse problema ocorrerá apenas quando eu executar o meu script no supervisor linux, não com o comando padrão comodotnet AppRazen.dll
Essencialmente, estou executando o script com umsystemd
serviço como este:
[Unit]
Description = Daemon description
[Service]
ExecStart = /usr/bin/dotnet /home/root/Desktop/publish/AppRazen.dll
WorkingDirectory= /home/root/Desktop/publish
Restart = always
RestartSec = 3
[Install]
WantedBy = multi-user.target
Sinceramente, não sei como posso corrigir isso. Alguém tem alguma idéia?
Desde já, obrigado