C# 等待不&x27;不要等待方法?

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

我有一个问题,最后一行(waiting.Stop)没有等待方法完成。它只是立即关闭控制台应用程序,而不是等待方法完成

有人能帮忙吗?我不想用.Wait()阻塞线程

这里是停止方法

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,它将执行完全相同的操作。