потому что while() это приводит к высокой загрузке ЦП, как я могу запустить асинхронный метод, но дождаться нажатия CTRL + C перед выходом из программы?
class Program
{
public static bool isRunning = true;
static void Main(string[] args)
{
Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);
// run async method...
Console.WriteLine("-> Press CTRL+C to Exit");
while (isRunning) { } // <- wait but without this
}
static void Console_CancelKeyPress(object? sender, ConsoleCancelEventArgs e)
{
e.Cancel = true;
isRunning = false;
Console.WriteLine("CancelKeyPress fired, exit...");
}
}
нет токена отмены
Описанное вами поведение не является типичным поведением консольного приложения. Вместо этого вы можете рассмотреть возможность создания приложения Windows Forms или приложения WPF. Почему вы решили создать консольное приложение?
На самом деле я бы сказал, что служба Windows более подходит, чем приложение с графическим интерфейсом.
Это то, что помогает? stackoverflow.com/questions/2586612/…
// run async method... пожалуйста, покажите настоящий код, потому что у вас void Main нет async Task Main@Charlieface это HttpListener с BeginGetContext
Не вижу этого в вашем посте, но вам понадобится EndGetContext, иначе это будет зацикливаться навсегда.
Изучите расширения хостинга Microsoft (Nuget); здесь вы заново изобретаете решенную проблему. Время жизни консоли с выходом Ctrl+C является для нее одной из базовых/стандартных конфигураций.





Быстрый «хак» — добавить Task.Delay, чтобы ваш основной поток не использовал ресурсы:
Task.Run(async () =>
{
// Do your work here
for (int i = 0; ; i++)
{
Console.WriteLine(i);
await Task.Delay(500);
}
});
Console.WriteLine("Press Ctrl+C to exit");
while (true)
{
await Task.Delay(1000);
}
Более правильный способ — использовать TaskCompletionSource:
var cts = new TaskCompletionSource();
_ = Task.Run(async () =>
{
// Do your work here
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
await Task.Delay(500);
}
// Done: report it as done
cts.TrySetResult();
});
Console.WriteLine("Press Ctrl+C to exit or wait until the app finishes");
await cts.Task;
Если ваша работа бесконечна и останавливается только на вводе пользователей, просто не звоните TrySetResult никуда.
это так просто, но когда ты застреваешь, ты забываешь это простое решение
он использует 0% загрузки ЦП вместо while(true) использования 10-50% ЦП
Console.WriteLine("Press CTRL+C to Exit");
Console.ReadKey();
Метод ReadKey/ReadLine выполняется синхронно. То есть блокирует пока не будет нажата клавиша
Принимает ли ваш асинхронный метод токен отмены?