废话不多说,直接说问题和解决办法。为国内资料少得可怜的.net core添点砖加点瓦。
一、问题:
.net core控制台应用程序中,有时候需要使用Console.ReadKey()阻塞,保持窗口活动。像Read(),ReadLine()也可以实现类似需要。这三种方式我在windows、Linux中都没有问题,正常使用。但是某次我将带有ReadKey()阻塞进程的程序放到Docker中使用时,发现报错:“System.InvalidOperationException: Cannot read keys when either application does not have a console or when console input has been redirected. Try Console.Read.at System.ConsolePal.ReadKey(Boolean intercept)”。ReadKey()用不了。让尝试使用Read(),跟着提示用了Read(),发现错是没报了。但是程序看着想是起不来。原因是Read(),和ReadLine()在Docker中无法起到阻塞进程的作用。具体原因我也没研究,只知道不能用。下面说比较简单的处理办法。
二、解决办法:
有问题的代码:
static void Main(string[] args) { //你的业务逻辑代码 Console.ReadKey(); }
处理办法:
private static readonly AutoResetEvent _closingEvent = new AutoResetEvent(false); static void Main(string[] args) { //你的业务逻辑代码 Console.CancelKeyPress += ((s, a) => { Console.WriteLine("程序已退出!"); _closingEvent.Set(); }); _closingEvent.WaitOne(); }
这样处理后,问题就解决了。退出程序Ctrl+C。
三、结语:
别问为什么。不知道。有些东西适合刨根问底,但是有些东西不适合。我觉得这个问题不适合。知道就行了。
还有,如果这篇文章对你有那么点用。你想转载到自己的博客啥的地方的话(其实就是复制粘贴,然后标一下我的链接),麻烦高台贵手。因为我对这样的行为烦不胜烦。为什么呢?因为每当我有问题想在百度搜索看一下的时候。经常会遇到那种搜索结果页几乎一整页的文章都是一样的,看着就像复制粘贴过来的。给我们这些想找问题的菜鸟带来了不少麻烦,点进去一个一样的东西,点进去一个一样的东西。你烦不烦?你~烦~不烦?反正我是很烦。把别人的东西复制粘贴过来干嘛?给自己的博客增添一点文章数?能不能干点实事?能不能干点实事?哪天你也想找个问题的时候发现搜索也大部分都是一样的东西的时候,你怎么想?所以我建议能够看到这段话的大佬、萌新们。如果你发现国内网上对一个问题的某一种情况有了几篇文章的解释的时候,即使你觉得这东西有用,好使,也不要复制粘贴发表。为了方便日后自己找的话,你可以记在类似博客园日记、文章等这些自由自己可以看到的地方。以免干扰到别人的筛选。当然如果你发现网上对于一个问题的文章很少,几乎没有,而你正好又知道,那就希望你不要藏着掖着。花丁点时间,写个文章发表一下。那我们这些菜鸟肯定是非常感谢您的。
不喜勿喷!!!不喜勿喷!!!不喜勿喷!!!
有机会再见!