我遇到了问题,最后一行(等待.Stop)不等待方法完成。它只是立即关闭控制台应用程序,而不是等待方法完成。
任何人都可以帮忙吗?我不想用.Wait()
来阻止线程private static void Main(string[] args)
{
var rebootAfterClose = false;
while (true)
{
var input = Console.ReadKey();
if (input.Key == ConsoleKey.C && input.Modifiers == ConsoleModifiers.Control)
{
break;
}
if (input.Key != ConsoleKey.R || input.Modifiers != ConsoleModifiers.Control)
{
continue;
}
rebootAfterClose = true;
break;
}
Task.Run(async delegate { await Server?.Stop(rebootAfterClose); });
}
这是Stop方法。
public async Task Stop(bool restart)
{
Console.Clear();
Logger.Warn("Server is " + (restart ? "rebooting" : "shutting down") + "....");
await Task.Delay(5000);
Dispose();
if (restart)
{
Process.Start(Assembly.GetExecutingAssembly().Location);
}
Environment.Exit(0);
}
答案 0 :(得分:3)
psql -E
确保确保方法的其余部分在等待的对象完成之后才运行。您的异步方法是:
await
在async delegate { await Server?.Stop(rebootAfterClose); }
返回的Task
完成之后,它将继续使用该方法的其余部分(根本不执行任何操作)。
当你致电Stop
时 所做的会安排你提供的lambda在另一个线程中运行(特别是后台线程;请记住,它是相关的),然后马上给你一个Task.Run
,告诉你它什么时候结束。然后你将Task
扔到地板上,永远不要看它,并完成你的Task
方法。此时没有正在运行的前台线程,因此应用程序结束。
当然,如果您希望应用程序不仅仅是结束,那么基本上某些需要在前台线程中运行。这意味着阻止主线程,或者因为你实际上没有在这里使用异步,所以根本不使用异步操作而只是使用同步操作。这通常更适合控制台应用程序。