Async always WaitingForActivation

后端 未结 5 1075
夕颜
夕颜 2020-12-02 21:50

I am trying to figure out what the async & await keywords are all about, however the output isn\'t what I\'m expecting.

The console app

5条回答
  •  有刺的猬
    2020-12-02 22:53

    I had the same problem. The answers got me on the right track. So the problem is that functions marked with async don't return a task of the function itself as expected (but another continuation task of the function).

    So its the "await"and "async" keywords that screws thing up. The simplest solution then is simply to remove them. Then it works as expected. As in:

    static void Main(string[] args)
    {
        Console.WriteLine("Foo called");
        var result = Foo(5);
    
        while (result.Status != TaskStatus.RanToCompletion)
        {
            Console.WriteLine("Thread ID: {0}, Status: {1}", Thread.CurrentThread.ManagedThreadId, result.Status);
            Task.Delay(100).Wait();
        }
    
        Console.WriteLine("Result: {0}", result.Result);
        Console.WriteLine("Finished.");
        Console.ReadKey(true);
    }
    
    private static Task Foo(int seconds)
    {
        return Task.Run(() =>
        {
            for (int i = 0; i < seconds; i++)
            {
                Console.WriteLine("Thread ID: {0}, second {1}.", Thread.CurrentThread.ManagedThreadId, i);
                Task.Delay(TimeSpan.FromSeconds(1)).Wait();
            }
    
            return "Foo Completed.";
        });
    }
    

    Which outputs:

    Foo called
    Thread ID: 1, Status: WaitingToRun
    Thread ID: 3, second 0.
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 3, second 1.
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 3, second 2.
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 3, second 3.
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 3, second 4.
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Thread ID: 1, Status: Running
    Result: Foo Completed.
    Finished.
    

提交回复
热议问题