【问题标题】:Using CancelKeyPress event on a .NET console app在 .NET 控制台应用程序上使用 CancelKeyPress 事件
【发布时间】:2016-04-26 15:18:31
【问题描述】:

我在 v4.5.1 上编写了一个 .NET 控制台应用程序(使用 C#)。我的Main 方法如下所示:

public static void Main(string[] args)
{
    Console.CancelKeyPress += delegate
                              {
                                  CancelToken.Cancel();
                              };

    var kbTask = Task.Run(async () =>
                                {
                                    while (true)
                                    {
                                        await ProcessCommand(Console.ReadLine());
                                    }
                                }, CancelToken.Token);

    kbTask.Wait(CancelToken.Token);
}

其中一个可能的命令(由ProcessCommand 处理)调用一个长时间运行的进程,我希望能够通过Console.CancelKeyPress 委托使用CTRL + C 取消该进程。

但是当我这样做时,Visual Studio 会打开一个选项卡,上面写着“mscorlib.dll 未加载”,然后什么也不做 - 控制台保持打开但无响应。

我也尝试在调试之外运行该应用,但找不到可执行文件。

【问题讨论】:

  • 你需要在while循环设置后检查取消令牌的状态。
  • 水晶球说您使用 Avast。尽快卸载。
  • @HansPassant 你的水晶球错了。除了现有的 Windows Defender 之外,没有安装任何 AV。
  • @Sean 长时间运行的进程会经过一个foreach 循环,在每次循环结束时,我都会检查 CancellationToken(它是一个全局的)。

标签: c# console-application cancellation cancellationtokensource cancellation-token


【解决方案1】:

转到工具、选项、调试、符号并设置缓存位置。然后在上面点击加载,它会为您获取必要的符号并将它们存储在您提供的缓存位置。

Microsoft 的编译器工具在扩展名为 .pdb(程序数据库)的单独文件中创建符号。这允许他们为发布二进制文件创建分离的符号。使用符号服务器,您的 IDE 可以在调试期间获取与特定版本的 DLL 匹配的符号文件。您也可以为自己的产品二进制文件配置此系统,这对于事后调试最终用户计算机上的任何崩溃非常有用。

有关使用其公共符号的更多详细信息,请参阅 Microsoft Documentation

【讨论】:

  • 完成此操作后,我可以看到正在动态加载的符号,但是现在当我按下 CTRL+C 时,Visual Studio 会打开一个选项卡,上面写着“源不可用”,并且控制台再次没有响应。跨度>
  • "Source Not Available" 当应用程序试图读取一些非托管代码时发生错误。让我为你解决这个问题。
猜你喜欢
  • 2010-11-10
  • 2013-03-16
  • 2011-03-14
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多