【发布时间】:2016-05-10 08:34:49
【问题描述】:
当 lambda 表达式 () => DoSomethingAsync() 和 async () => await DoSomethingAsync() 都输入为 Func<Task> 时,它们之间有区别吗?我们应该在什么时候选择哪一个?
这是一个简单的控制台应用程序
using System;
using System.Threading.Tasks;
namespace asyncDemo
{
class Program
{
static void Main(string[] args)
{
var demo = new AsyncDemo();
var task = demo.RunTheDemo();
task.Wait();
Console.ReadLine();
}
}
public class AsyncDemo
{
public async Task Runner(Func<Task> action)
{
Console.WriteLine(DateTime.Now.ToLongTimeString() + " Launching the action");
await action();
}
private async Task DoSomethingAsync(string suffix)
{
await Task.Delay(2000);
Console.WriteLine(DateTime.Now.ToLongTimeString() + " Done something, " + suffix);
}
public async Task RunTheDemo()
{
await Runner(() => DoSomethingAsync("no await"));
await Runner(async () => await DoSomethingAsync("with await"));
}
}
}
输出是:
09:31:08 Launching the action
09:31:10 Done something, no await
09:31:10 Launching the action
09:31:12 Done something, with await
所以在RunTheDemo 中,对await Runner(someLambda); 的两个调用似乎都以相同的时间特性执行相同的操作 - 都具有正确的两秒延迟。
两条线都有效,那么它们是否完全相同? () => DoSomethingAsync() 和 async () => await DoSomethingAsync() 构造之间有什么区别?我们应该在什么时候选择哪一个?
这与“我是否应该在一般情况下使用await”不是同一个问题,因为这里我们正在处理工作异步代码,lambdas 类型为Func<Task>,在消费方法中正确等待。问题在于这些 lambda 是如何声明的,以及声明的效果是什么。
【问题讨论】:
-
它基本上是编译器简化了 lambda 并从 DoSomething 自动返回任务...添加括号,现在它倒下,您必须执行异步或手动返回任务。
-
您的示例异步 lambda 是微不足道的 - 它相当于
return await反模式(这是该方法中唯一使用的await) - 您涉及所有异步机制没有目的。
标签: c# asynchronous lambda async-await