C# 等待不&x27;不要等待方法?
我有一个问题,最后一行(waiting.Stop)没有等待方法完成。它只是立即关闭控制台应用程序,而不是等待方法完成 有人能帮忙吗?我不想用.Wait()阻塞线程 这里是停止方法C# 等待不&x27;不要等待方法?,c#,.net,C#,.net,我有一个问题,最后一行(waiting.Stop)没有等待方法完成。它只是立即关闭控制台应用程序,而不是等待方法完成 有人能帮忙吗?我不想用.Wait()阻塞线程 这里是停止方法 public async Task Stop(bool restart) { Console.Clear(); Logger.Warn("Server is " + (restart ? "rebooting" : "shutting down") + "...."); await Task
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);
}
await
确保在等待的对象完成之前,方法的其余部分不会运行。您的异步方法是:
async delegate { await Server?.Stop(rebootAfterClose); }
直到Stop
返回的Task
完成后,它才会继续执行方法的其余部分(碰巧什么也不做)
当您调用Task.Run
时,它所做的是安排您提供的lambda在另一个线程(特别是后台线程;请记住,它是相关的)中运行,然后立即返回一个任务
,告诉您任务何时完成。然后你把任务
扔到地板上,永远不要看它,然后完成你的Main
方法。此时没有前台线程在运行,因此应用程序将结束
因此,如果希望应用程序不只是结束,那么基本上需要在前台线程中运行一些东西。这意味着要么阻塞主线程,要么因为在这里使用异步实际上没有什么好处,所以根本不使用异步操作,而是使用同步操作。这通常更适合于控制台应用程序。await
确保在等待的对象完成之前,方法的其余部分不会运行。您的异步方法是:
async delegate { await Server?.Stop(rebootAfterClose); }
直到Stop
返回的Task
完成后,它才会继续执行方法的其余部分(碰巧什么也不做)
当您调用Task.Run
时,它所做的是安排您提供的lambda在另一个线程(特别是后台线程;请记住,它是相关的)中运行,然后立即返回一个任务
,告诉您任务何时完成。然后你把任务
扔到地板上,永远不要看它,然后完成你的Main
方法。此时没有前台线程在运行,因此应用程序将结束
因此,如果希望应用程序不只是结束,那么基本上需要在前台线程中运行一些东西。这意味着要么阻塞主线程,要么因为在这里使用异步实际上没有什么好处,所以根本不使用异步操作,而是使用同步操作。这通常更适合于控制台应用程序。在这里使用异步根本没有意义。只需使整个调用堆栈同步,从
Main
方法到Stop
方法。while循环中的逻辑非常复杂。您可以将其简化为: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){rebootAfterClose=true;break;}
此代码看起来更像Windows服务,而不是控制台应用程序;您是否希望主线程返回某种服务主机?在这里使用异步根本没有意义。只需使整个调用堆栈同步,从main
方法到Stop
方法。该中的逻辑>while
循环确实很复杂。您可以将其简化为: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){rebootAfterClose=true;break;}
此代码看起来更像Windows服务,而不是控制台应用程序;您是否希望主线程返回某种服务主机?我首先使用async的原因是为了等待(5秒延迟)关闭前警告游戏中的玩家。如果我使用thread.sleep,它将执行完全相同的操作。我首先使用async的原因是,我可以在关闭前等待(5秒延迟)来警告游戏中的玩家。如果我使用thread.sleep,它将执行完全相同的操作。