【问题标题】:Why ReadKey throws exception while running a .net-core console app from Git Bash?为什么从 Git Bash 运行 .net-core 控制台应用程序时 ReadKey 会引发异常?
【发布时间】:2020-10-09 15:28:53
【问题描述】:

这是代码:

ConsoleKeyInfo cki;

while((cki = Console.ReadKey(true)).Key != ConsoleKey.Escape)
{
    Console.WriteLine(cki.Key);
}

当我使用 dotnet run 从 cmd 或 powershell 运行它时,一切正常。但是,当我从 Git Bash 运行它时,它会引发以下异常:

未处理的异常。 System.InvalidOperationException:当任一应用程序没有控制台或控制台输入已被重定向时,无法读取密钥。试试 Console.Read。

【问题讨论】:

    标签: c# .net-core git-bash


    【解决方案1】:

    那么,据推测,Git Bash 正在使用 IO 重定向——这是允许的——而其他的......不是。那么,解决方案是使用Read 而不是ReadKey - 至少在重定向起作用的情况下。您可能可以通过Console.IsInputRedirected检测这个 - 并为可能的情况选择最有用的策略,但是:您将无法以相同的方式检测 keys ,因此您可能需要在这种情况下获得稍微不同的用户体验。

    【讨论】:

      【解决方案2】:

      基本上,100% 符合 Marc 在他的回答中所说的内容。

      旁注:在类似 linux 的终端(和 git-bash 就是其中之一)下,中止当前阻塞/持有控制台的交互式应用程序/脚本的典型(甚至标准)方法是按 Control+C . net-core 控制台应用程序支持这一点。通过 control+c 实现这一点比尝试查看正在按下的键要容易得多。

      IIRC,net-core 应用程序会自动检测到按下 control+C,默认情况下它们只是退出,这使得控制台可以再次被用户使用。这意味着不需要编写额外的代码,甚至while(true) 循环也可以由此停止(处理 control+c 的事件处理程序在线程池上运行,无论主线程是否忙)。

      https://docs.microsoft.com/en-us/dotnet/api/system.console.cancelkeypress?view=netcore-3.1

      默认情况下,Cancel 属性为 false,这会导致程序执行在事件处理程序退出时终止。将其属性更改为 true 指定应用程序应继续执行。

      【讨论】:

        【解决方案3】:

        如果我们在使用 Net5.0 调整窗口大小时处理符文宽度大于 1 的 unicode,这两种操作系统仍然会发生这种情况,WindowsLinux

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-09-24
          • 2011-04-16
          • 1970-01-01
          • 2017-01-02
          • 1970-01-01
          • 1970-01-01
          • 2018-12-11
          • 1970-01-01
          相关资源
          最近更新 更多