【发布时间】:2019-06-19 15:00:11
【问题描述】:
为什么按下 Ctrl+C 时这个控制台应用程序不退出?
程序输出:
Press Ctrl+C to stop...
doing stuff.
doing stuff.
...
*Ctrl+C pressed*
exiting...
*never actually exits*
class Program {
static void Main(string[] args) {
MainAsync(args).GetAwaiter().GetResult();
}
private static async Task MainAsync(string[] args) {
MyAsyncClass myAsync = new MyAsyncClass();
var tcs = new TaskCompletionSource<object>();
Console.CancelKeyPress += (sender, e) => { tcs.SetResult(null); };
var task = Task.Run(() => myAsync.Start());
await Console.Out.WriteLineAsync("Press Ctrl+C to stop...");
await tcs.Task;
await Console.Out.WriteLineAsync("exiting...");
}
}
public class MyAsyncClass {
public async Task Start() {
while(true) {
await Console.Out.WriteLineAsync("doing stuff.");
Thread.Sleep(1000);
}
}
}
【问题讨论】:
-
不是更像 ctrl-D 吗?
-
Task.Run正在调用异步代码而不等待它。 -
即使我完全注释掉了while循环,它仍然挂起......
标签: c# event-handling task cancellation