Why is async/await not working in my ASP.net 5 Console Application?

前端 未结 1 1402
无人共我
无人共我 2021-01-12 18:50

I tried this simple ASP.net 5 Console Application on both Windows (.NET 4.5.1) and Linux (Mono 4.0.1), both times with the same result.

Note: I call

相关标签:
1条回答
  • 2021-01-12 19:44

    If you see my question (and answer) in Entry point can be marked with the 'async' modifier on CoreCLR?, you'll see that at the top-most of the call-stack, you have the following:

    public static int Execute(string[] args)
    {
        // If we're a console host then print exceptions to stderr
        var printExceptionsToStdError = Environment
                                        .GetEnvironmentVariable
                                         (EnvironmentNames.ConsoleHost) == "1";
    
        try
        {
            return ExecuteAsync(args).GetAwaiter().GetResult();
        }
        catch (Exception ex)
        {
            if (printExceptionsToStdError)
            {
                PrintErrors(ex);
                return 1;
            }
    
            throw;
        }
    }
    

    Internally, it checks to see the return type of the method, if the return type is of type Task, then it registers a ContinueWith, which it'll be able to synchronously wait on:

    if (result is Task)
    {
        return ((Task)result).ContinueWith(t =>
        {
            return 0;
        });
    }
    

    When you pass in async void, it looks to Execute as if this method is a "fire and forget" void returning method. That's why it never finishes execution. But, if you change it to return a Task, it'll work:

    public async Task Main(String[] args)
    {
        #if DNX451
        AppDomain.CurrentDomain.UnhandledException += 
            (s, e) => Console.WriteLine(e);
        #endif
    
        try
        {
            await Task.Delay(1000);
            Console.WriteLine("After Task.Delay");
        }
        finally
        {
            Console.WriteLine("Inside Finally");
        }
    }
    
    0 讨论(0)
提交回复
热议问题