Diğer cevapların bazılarının iyi işlemediği durumları ele almak:
- Duyarlı : tuşa basma işlem kodunun doğrudan yürütülmesi; yoklama veya engelleme gecikmelerinin değişkenliklerini önler
- İsteğe bağlılık: global tuşa basma seçeneği ; aksi takdirde uygulama normal şekilde çıkmalıdır
- Endişelerin ayrılması : daha az invaziv dinleme kodu; normal konsol uygulama kodundan bağımsız olarak çalışır.
Bu sayfadaki çözümlerin çoğu yoklama Console.KeyAvailable
veya engelleme içeriyor Console.ReadKey
. Console
Burada .NET'in çok fazla işbirliği yapmadığı doğru olsa da , Task.Run
daha modern bir Async
dinleme moduna geçmek için kullanabilirsiniz .
Dikkat edilmesi gereken temel sorun, varsayılan olarak, konsol iş parçacığınızın Async
çalışma için ayarlanmadığıdır - yani, main
işlevlerinizi Async
tamamladığınızda, tamamlamayı beklemek yerine AppDoman ve işleminizin sona ereceği . Bunu ele almanın uygun bir yolu , tek iş parçacıklı konsol programınızda tam destek sağlamak için Stephen Cleary'nin AsyncContext'ini kullanmak olacaktır Async
. Ancak bir tuşa basmayı beklemek gibi daha basit durumlar için, tam bir trambolin takmak aşırı olabilir.
Aşağıdaki örnek, bir tür yinelemeli toplu iş dosyasında kullanılan bir konsol programı için olabilir. Bu durumda, program çalışmasıyla tamamlandığında, normalde bir tuşa basmaya gerek kalmadan çıkmalıdır ve daha sonra uygulamanın çıkmasını önlemek için isteğe bağlı bir tuşa basmaya izin veriyoruz . Muhtemelen devam edecek bir şeyleri incelemek için döngüyü duraklatabilir veya duraklamayı, toplu iş dosyasından temiz bir şekilde kurtulmak için bilinen bir 'kontrol noktası' olarak kullanabiliriz.
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
}
}