我有以下用DotNet 6编写的程序:

var cancellationTokenSource = new CancellationTokenSource();

Console.CancelKeyPress += (object? sender, ConsoleCancelEventArgs e) =>
{
    cancellationTokenSource.Cancel();
};

await DoAsync(cancellationTokenSource.Token);

Console.WriteLine("Finished!");

async Task DoAsync(CancellationToken token)
{
    while (!token.IsCancellationRequested)
    {
        Console.WriteLine("Test!");
        await Task.Delay(1000);
    }
}

当我按"Ctrl+C"时,程序退出,错误代码如下: "Program.exe exited with code -1073741510"."Finished!"永远不会被写到屏幕上.

我不知道到底发生了什么,但似乎cancellationTokenSource.Cancel()抛出了一个异常,程序结束时出现了错误.据我所知,当调用ancellationTokenSource.Cancel()时,cancellationTokenSource.Token.IsCancellationRequested被设置为True,不应该抛出异常.

应用程序结束时出现异常的原因是什么?当用户按下"Ctrl + C"时,我如何才能正常退出应用程序?

我用谷歌搜索了很多,但就是找不到答案.

推荐答案

Ctrl+C将终止应用程序.正如CancelKeyPress文档所解释的那样,处理该事件不会阻止终止.

为避免终止,您需要将ConsoleCancelEventArgs.Cancel设置为true

Console.CancelKeyPress += (object? sender, ConsoleCancelEventArgs e) =>
{
    e.Cancel=true;
    cancellationTokenSource.Cancel();
};

Csharp相关问答推荐

在ASP.NET中为数据注释 Select 合适的语言

如何使用Automapper映射两个嵌套列表

在. NET Core 8 Web API中,当为服务总线使用通用消费者时,如何防止IServiceProvider被释放或空?"

只有第一个LINQ.Count()语句有效

如何使datagridview的列具有响应性,以便不是所有列都更改其宽度

如何在页面重新加载后保持菜单切换状态

MS Graph v5.42.0:在寻呼消息时更改页面大小

由于POST中的应用程序/JWT,出现不支持的内容类型异常

TCPClient阅读流

如何通过属性初始化器强制初始化继承记录内的属性?

如果设置了另一个属性,则Newtonsoft JSON忽略属性

为什么方法的值在SELECT方法中不会更改?

有没有更好的方法来在CosmosDB上插入非id?

Google OAuth令牌交换在.Net中不起作用

升级后发出SWITCH语句

为什么我的用户界面对象移动到略低于实际目标?

为什么我在使用有效令牌的情况下仍未获授权?

使用ITfoxtec.Identity.Saml2解析相同键多值SAML 2声明

S,在.NET核心控制台应用程序中,AddScope和AddSingleton有什么不同?

我如何为我的Blazor应用程序构建一个动态教程标注?