等待不等待方法?

时间:2018-01-26 16:16:23

标签: c# .net

我遇到了问题,最后一行(等待.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);
}

1 个答案:

答案 0 :(得分:3)

psql -E 确保确保方法的其余部分在等待的对象完成之后才运行。您的异步方法是:

await

async delegate { await Server?.Stop(rebootAfterClose); } 返回的Task完成之后,它将继续使用该方法的其余部分(根本不执行任何操作)。

当你致电Stop 所做的会安排你提供的lambda在另一个线程中运行(特别是后台线程;请记住,它是相关的),然后马上给你一个Task.Run,告诉你它什么时候结束。然后你将Task扔到地板上,永远不要看它,并完成你的Task方法。此时没有正在运行的前台线程,因此应用程序结束。

当然,如果您希望应用程序不仅仅是结束,那么基本上某些需要在前台线程中运行。这意味着阻止主线程,或者因为你实际上没有在这里使用异步,所以根本不使用异步操作而只是使用同步操作。这通常更适合控制台应用程序。