Bagaimana saya bisa terus menjalankan aplikasi konsol saya sampai tombol ditekan (suka Escditekan?)
Saya menganggap itu melilit loop sementara. Saya tidak sukaReadKey
karena memblokir operasi dan meminta kunci, daripada hanya melanjutkan dan mendengarkan tekan tombol.
Bagaimana ini bisa dilakukan?
c#
console-application
karlstackoverflow
sumber
sumber
Console.ReadLine()
dan Anda sudah siap, bukan?Anda dapat sedikit mengubah pendekatan Anda - gunakan
Console.ReadKey()
untuk menghentikan aplikasi Anda, tetapi lakukan pekerjaan Anda di utas latar:Dalam
myWorker.DoStuff()
fungsi ini Anda akan memanggil fungsi lain pada utas latar belakang (menggunakanAction<>()
atauFunc<>()
merupakan cara mudah untuk melakukannya), lalu segera kembali.sumber
Cara terpendek:
Console.ReadKey()
adalah fungsi pemblokiran, menghentikan eksekusi program dan menunggu penekanan tombol, tetapi berkat pemeriksaanConsole.KeyAvailable
pertama,while
loop tidak diblokir, tetapi berjalan sampai Escditekan.sumber
Dari Bangunan kutukan video. Aplikasi Konsol NET di C # oleh Jason Roberts di http://www.pluralsight.com
Kita bisa melakukan beberapa proses berikut untuk menjalankan
sumber
Console.CursorVisible = false;
akan lebih baik untuk menghindari gangguan kursor berkedip. Tambahkan baris ini sebagai baris pertama distatic void Main(string[] args)
blok.Berikut adalah pendekatan bagi Anda untuk melakukan sesuatu pada utas yang berbeda dan mulai mendengarkan tombol yang ditekan pada utas yang berbeda. Dan Konsol akan berhenti memprosesnya saat proses Anda yang sebenarnya berakhir atau pengguna menghentikan proses dengan menekan Esctombol.
sumber
Jika Anda menggunakan Visual Studio, maka Anda dapat menggunakan "Mulai Tanpa Debugging" di menu Debug.
Secara otomatis akan menulis "Tekan tombol apa saja untuk melanjutkan ..." ke konsol untuk Anda setelah menyelesaikan aplikasi dan itu akan meninggalkan konsol terbuka untuk Anda sampai tombol ditekan.
sumber
Mengatasi kasus-kasus yang beberapa jawaban lainnya tidak ditangani dengan baik:
Banyak solusi di halaman ini melibatkan polling
Console.KeyAvailable
atau pemblokiranConsole.ReadKey
. Meskipun memang benar. NETConsole
tidak terlalu kooperatif di sini, Anda dapat menggunakanTask.Run
untuk beralih keAsync
mode mendengarkan yang lebih modern .Masalah utama yang harus diperhatikan adalah bahwa, secara default, utas konsol Anda tidak diatur untuk
Async
operasi - artinya, ketika Anda keluar dari bagian bawahmain
fungsi Anda , alih-alih menungguAsync
penyelesaian, AppDoman Anda dan prosesnya akan berakhir . Cara yang tepat untuk mengatasinya adalah dengan menggunakan AsyncContext karya Stephen Cleary untuk membangunAsync
dukungan penuh dalam program konsol single-threaded Anda. Tetapi untuk kasus yang lebih sederhana, seperti menunggu penekanan tombol, memasang trampolin penuh mungkin berlebihan.Contoh di bawah ini adalah untuk program konsol yang digunakan dalam beberapa jenis file batch berulang. Dalam hal ini, ketika program selesai dengan pekerjaannya, biasanya ia harus keluar tanpa perlu menekan tombol, dan kemudian kami mengizinkan penekanan tombol opsional untuk mencegah aplikasi keluar. Kita dapat menjeda siklus untuk memeriksa hal-hal, mungkin melanjutkan, atau menggunakan jeda sebagai 'titik kontrol' yang dikenal di mana untuk membersihkan file batch.
sumber
dengan kode di bawah ini Anda dapat mendengarkan penekanan SpaceBar, di tengah-tengah eksekusi konsol Anda dan jeda sampai tombol lain ditekan dan juga mendengarkan EscapeKey untuk melanggar loop utama
sumber
Menurut pengalaman saya, di aplikasi konsol cara termudah untuk membaca tombol terakhir yang ditekan adalah sebagai berikut (Contoh dengan tombol panah):
Saya menggunakan untuk menghindari loop, alih-alih saya menulis kode di atas dalam suatu metode, dan saya menyebutnya di akhir "Method1" dan "Method2", jadi, setelah menjalankan "Method1" atau "Method2", Console.ReadKey () .Key siap membaca kunci lagi.
sumber