将异步方法传递给Action参数[重复]时的结果不完整

问题描述 投票:-2回答:1

这个问题在这里已有答案:

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

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"); } } 。有关详细信息,请参阅下面的代码。

End JobAsync

在下面的输出中,

开始主要

开始吧

开始JobAsync

结束做

结束主要

End JobAsync不存在。

Question

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

欢迎任何建议或意见!如果Func<...,Task来自第三方库,我们怎么知道我们不能将异步方法传递给它?

Edit

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

c# asynchronous async-await
1个回答
1
投票

你的异步方法返回一个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"); } 。然后你必须等待任务。

qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.