.Net Core控制檯應用程式使用Read、ReadLine和ReadKey在Docker中執行的坑。
廢話不多說,直接說問題和解決辦法。為國內資料少得可憐的.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)
二、解決辦法:
有問題的程式碼:
static void Main(string[] args) { //你的業務邏輯程式碼 Console.ReadKey(); }
處理辦法:
private static readonly AutoResetEvent _closingEvent = newAutoResetEvent(false); static void Main(string[] args) { //你的業務邏輯程式碼 Console.CancelKeyPress += ((s, a) => { Console.WriteLine("程式已退出!"); _closingEvent.Set(); }); _closingEvent.WaitOne(); }
這樣處理後,問題就解決了。退出程式Ctrl+C。
三、結語:
別問為什麼。不知道。有些東西適合刨根問底,但是有些東西不適合。我覺得這個問題不適合。知道就行了。
還有,如果這篇文章對你有那麼點用。你想轉載到自己的部落格啥的地方的話(其實就是複製貼上,然後標一下我的連結),麻煩高臺貴手。因為我對這樣的行為煩不勝煩。為什麼呢?因為每當我有問題想在百度搜索看一下的時候。經常會遇到那種搜尋結果頁幾乎一整頁的文章都是一樣的,看著就像複製貼上過來的。給我們這些想找問題的菜鳥帶來了不少麻煩,點進去一個一樣的東西,點進去一個一樣的東西。你煩不煩?你~煩~不煩?反正我是很煩。把別人的東西複製貼上過來幹嘛?給自己的部落格增添一點文章數?能不能幹點實事?能不能幹點實事?哪天你也想找個問題的時候發現搜尋也大部分都是一樣的東西的時候,你怎麼想?所以我建議能夠看到這段話的大佬、萌新們。如果你發現國內網上對一個問題的某一種情況有了幾篇文章的解釋的時候,即使你覺得這東西有用,好使,也不要複製貼上發表。為了方便日後自己找的話,你可以記在類似部落格園日記、文章等這些自由自己可以看到的地方。以免干擾到別人的篩選。當然如果你發現網上對於一個問題的文章很少,幾乎沒有,而你正好又知道,那就希望你不要藏著掖著。花丁點時間,寫個文章發表一下。那我們這些菜鳥肯定是非常感謝您的。
不喜勿噴!!!不喜勿噴!!!不喜勿噴!!!
有機會再見!