【发布时间】: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