Saya ingin dapat menjebak CTRL+ Cdi aplikasi konsol C # sehingga saya dapat melakukan beberapa pembersihan sebelum keluar. Apa cara terbaik untuk melakukan ini?
222
Lihat MSDN:
Artikel dengan contoh kode:
CancelKeyPress
hanya disebutkan secara singkat di komentar. Artikel yang bagus adalah codeneverwritten.com/2006/10/…Acara Console.CancelKeyPress digunakan untuk ini. Ini adalah bagaimana ini digunakan:
Ketika pengguna menekan Ctrl + C kode dalam delegasi dijalankan dan program keluar. Ini memungkinkan Anda untuk melakukan pembersihan dengan memanggil metode yang diperlukan. Perhatikan bahwa tidak ada kode setelah delegasi dieksekusi.
Ada situasi lain di mana ini tidak akan memotongnya. Misalnya, jika program saat ini melakukan perhitungan penting yang tidak dapat segera dihentikan. Dalam hal itu, strategi yang tepat mungkin adalah memberi tahu program untuk keluar setelah perhitungan selesai. Kode berikut memberikan contoh bagaimana ini dapat diterapkan:
Perbedaan antara kode ini dan contoh pertama adalah yang
e.Cancel
disetel ke true, yang berarti eksekusi berlanjut setelah delegasi. Jika dijalankan, program menunggu pengguna menekan Ctrl + C. Ketika itu terjadi,keepRunning
nilai perubahan variabel yang menyebabkan loop sementara keluar. Ini adalah cara untuk membuat program keluar dengan anggun.sumber
keepRunning
mungkin perlu ditandaivolatile
. Utas utama mungkin menyimpannya di register CPU jika tidak, dan tidak akan melihat perubahan nilai ketika delegasi dieksekusi.ManualResetEvent
spin daripadabool
.winpty dotnet run
). Kalau tidak, delegasi tidak akan pernah dijalankan.Saya ingin menambahkan jawaban Jonas . Berputar pada a
bool
akan menyebabkan utilisasi CPU 100%, dan membuang banyak energi tanpa melakukan apa-apa sambil menunggu CTRL+ C.Solusi yang lebih baik adalah menggunakan a
ManualResetEvent
untuk benar-benar "menunggu" untuk CTRL+ C:sumber
Ini adalah contoh kerja yang lengkap. rekatkan ke proyek konsol C # kosong:
sumber
Pertanyaan ini sangat mirip dengan:
Tangkap keluar konsol C #
Inilah cara saya memecahkan masalah ini, dan menangani pengguna yang memukul X serta Ctrl-C. Perhatikan penggunaan ManualResetEvents. Ini akan menyebabkan thread utama tertidur yang membebaskan CPU untuk memproses thread lain sambil menunggu keluar, atau pembersihan. CATATAN: Perlu untuk mengatur TerminationCompletedEvent di akhir main. Kegagalan untuk melakukan hal itu menyebabkan latensi yang tidak perlu dalam penghentian karena waktu OS habis sementara membunuh aplikasi.
sumber
Console.TreatControlCAsInput = true;
telah bekerja untuk saya.sumber
Apa yang ada di dotnet c # diperlukan untuk itu - yang disebut token pembatalan diteruskan ke
Host.RunAsync(ct)
dan kemudian, dalam perangkap sinyal keluar, untuk Windows akan menjadi...
sumber