【问题标题】:Incomplete result when passing asynchronous method to Action parameter [duplicate]将异步方法传递给 Action 参数时结果不完整[重复]
【发布时间】:2019-04-24 07:38:04
【问题描述】:

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

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

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这种现象?

任何建议或cmets总是受欢迎的!如果Do来自第三方库,我们怎么知道不能给它传递异步方法呢?

编辑

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

【问题讨论】:

    标签: c# asynchronous async-await


    【解决方案1】:

    您的异步方法返回一个任务,因此您应该使用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");
    }
    

    【讨论】:

    • 嗯,await 没有async
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    相关资源
    最近更新 更多