Giải quyết các trường hợp mà một số câu trả lời khác không xử lý tốt:
- Responsive : thực thi trực tiếp mã xử lý nhấn phím; tránh sự mơ hồ của việc bỏ phiếu hoặc chặn sự chậm trễ
- Tùy chọn : nhấn phím toàn cầu là chọn tham gia ; nếu không thì ứng dụng sẽ thoát bình thường
- Tách các mối quan tâm : mã nghe ít xâm lấn; hoạt động độc lập với mã ứng dụng giao diện điều khiển bình thường.
Nhiều giải pháp trên trang này liên quan đến việc bỏ phiếu Console.KeyAvailable
hoặc chặn Console.ReadKey
. Mặc dù đúng là .NET Console
không hợp tác ở đây, nhưng bạn có thể sử dụng Task.Run
để chuyển sang Async
chế độ nghe hiện đại hơn .
Vấn đề chính cần lưu ý là, theo mặc định, luồng bàn điều khiển của bạn không được thiết lập để Async
hoạt động - có nghĩa là, khi bạn rơi khỏi đáy main
chức năng, thay vì chờ Async
hoàn thành, quá trình và AppDoman của bạn sẽ kết thúc . Một cách thích hợp để giải quyết vấn đề này là sử dụng AsyncContext của Stephen Clear để thiết lập Async
hỗ trợ đầy đủ trong chương trình bảng điều khiển đơn luồng của bạn. Nhưng đối với các trường hợp đơn giản hơn, như chờ nhấn phím, cài đặt một tấm bạt lò xo đầy đủ có thể là quá mức cần thiết.
Ví dụ dưới đây sẽ dành cho một chương trình giao diện điều khiển được sử dụng trong một số loại tệp lặp. Trong trường hợp này, khi chương trình được thực hiện với công việc của nó, thông thường nó sẽ thoát mà không cần nhấn phím, và sau đó chúng tôi cho phép nhấn phím tùy chọn để ngăn ứng dụng thoát. Chúng ta có thể tạm dừng chu trình để kiểm tra mọi thứ, có thể tiếp tục lại hoặc sử dụng tạm dừng như một 'điểm kiểm soát' đã biết để thoát ra khỏi tệp bó.
static void Main(String[] args)
{
Console.WriteLine("Press any key to prevent exit...");
var tHold = Task.Run(() => Console.ReadKey(true));
// ... do your console app activity ...
if (tHold.IsCompleted)
{
#if false // For the 'hold' state, you can simply halt forever...
Console.WriteLine("Holding.");
Thread.Sleep(Timeout.Infinite);
#else // ...or allow continuing to exit
while (Console.KeyAvailable)
Console.ReadKey(true); // flush/consume any extras
Console.WriteLine("Holding. Press 'Esc' to exit.");
while (Console.ReadKey(true).Key != ConsoleKey.Escape)
;
#endif
}
}