Это проблема отладчика Visual Studio, и я думаю, что это происходит потому, что Visual Studio отслеживает все запущенные потоки отдельно и, как вы сказали, у вас есть незавершенная задача, запущенная в другом потоке.
когда вы завершаете свою программу из командной строки, используя CTRL+C
, команда Line заставляет ваш основной поток остановиться. таким образом, ваш дочерний поток тоже будет останавливаться, но когда вы запускаете приложение с помощью VS-debugger, основной поток присоединяется к отладчику.
по умолчанию отладчик освободит все блокирующие потоки, если вы не обрабатываете событие Console.CancelKeyPress
, но не тогда, когда вы хотите вручную завершить вызовы. ( Я не уверен, почему )
, если вы хотите заставить отладчик завершить все потоки, которые вы должны сделать это вручную.
private static void End()
{
Console.WriteLine("EXITING...");
if (Debugger.IsAttached)
Environment.Exit(1); // this is equal to using CTRL+C in the terminal
}
также вы следует использовать токен отмены для полной отмены выполняемых задач перед завершением работы приложения.
class Program
{
private static CancellationTokenSource tokenSource;
static async Task Main(string[] args)
{
tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
Console.CancelKeyPress += (o, e) => End();
await Task.Run(() => Task.Delay(100000), token);
}
private static void End()
{
Console.WriteLine("EXITING...");
tokenSource.Cancel();
tokenSource.Dispose();
if (Debugger.IsAttached)
Environment.Exit(1);
}
}