gpt4 book ai didi

c# - 如何在 dotnet 应用程序中创建导航菜单?

转载 作者:太空宇宙 更新时间:2023-11-04 10:04:46 24 4
gpt4 key购买 nike

我创建了一个控制台应用程序,它有一个菜单,允许我在菜单项之间导航。我在这个方法中处理导航逻辑:

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;
}
}

here the full class .

现在在 Windows 上一切正常,但是当我在我的 linux 上使用 systemd 运行这个应用程序时,我得到:

Unhandled Exception: System.InvalidOperationException: Cannot read key when either application does not have a console or when console input has been redirected. Try Console.Read.

堆栈跟踪显示:

at System.ConsolePal.ReadKey(Boolean intercept)
at System.Console.ReadKey();
at AppRazen.Menu.ConsoleMenu.UpdateMenu();

经过一番查找,我发现这个问题与ReadKey()方法不完全有关compatible with linux .并提出解决方案here在我的情况下根本不起作用,因为用户使用了 OminSharp

我还尝试设置 ReadKey(false) 但这并没有解决问题,我还尝试使用 处理 UpdateMenu 中的所有内容Console.Read() 但控制台似乎卡住了。

请注意,只有当我在 linux supervisor 中运行我的脚本时才会发生此问题,而不是使用像 dotnet AppRazen.dll 这样的默认命令

本质上,我正在使用这样的 systemd 服务运行脚本:

[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

老实说,我不知道该如何解决。有人有什么想法吗?

提前致谢。

最佳答案

做你想做的事情的简短回答是你根本做不到。

想一想:您正在尝试创建一个交互式程序(用户可以通过键盘与之交互)。但是您还使它成为守护进程(守护进程运行后台并且不直接与用户交互)。这是两个相互矛盾的目标。

systemd(或 supervisord,或 upstart 或任何系统服务程序)将您的应用程序作为服务运行时,它不会为其提供一种与用户交互的方式,因为这些应用程序希望成为守护进程 - 这意味着用户无法与它们交互。

所以,问问自己你想做什么:你是否想制作一个交互式程序?如果你想制作一个交互式程序,你不能通过主管运行它。通过 dotnet/path/to/your.dll 直接运行它。

其他评论:

  • ReadKey 可能有问题,但肯定不是您想要做的常见情况,这似乎是 x86_64 上的 Linux。

  • OmniSharp 是一个用于 IDE/文本编辑器的插件,可以简化开发。它提供自动完成和实时语法突出显示。运行应用程序时不涉及它。

关于c# - 如何在 dotnet 应用程序中创建导航菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53300317/

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