将异步方法传递给Action参数时结果不完整

时间:2019-04-23 22:49:44

标签: c# asynchronous async-await

我不确定以前是否曾问过这种问题。我正在学习异步方法。

JobAsync是异步方法的一个简单示例,Do接受类型为Action的委托,而Main仅调用Do,后者依次调用JobAsync通过异步lambda。有关详细信息,请参见下面的代码。

class Program
{
    static async Task JobAsync()
    {
        Console.WriteLine("Begin JobAsync");
        await Task.Delay(5000);
        Console.WriteLine("End JobAsync");
    }

    static void Do(Action a)
    {
        Console.WriteLine("Begin Do");
        a();
        Console.WriteLine("End Do");
    }

    static async Task Main()
    {
        Console.WriteLine("Begin Main");
        Do(async () => await JobAsync());
        Console.WriteLine("End Main");
    }
}

在下面的输出中,

  

开始

     

开始做

     

开始JobAsync

     

结束做

     

结束主要

End JobAsync不存在。

问题

是什么原因导致输出中不存在End JobAsync的现象?

始终欢迎任何建议或评论!如果Do来自第三方库,我们怎么知道我们不能将异步方法传递给它?

编辑

经验法则是“不要将异步方法作为非异步方法的Func<...,TaskFunc<...,Task<...>>以外类型的参数传递?”

1 个答案:

答案 0 :(得分:1)

您的异步方法返回一个Task,因此您应该使用Func<Task>而不是Action。然后,您必须等待任务。

static async Task Do(Func<Task> a)
{
    Console.WriteLine("Begin Do");
    await a();  //Notice we await the result here
    Console.WriteLine("End Do");
}