Is there a difference between lambdas declared with and without async
<p>Is there a difference between lambdas <code>() =&gt; DoSomethingAsync()</code> and <code>async () =&gt; await DoSomethingAsync()</code> when both are typed as <code>Func&lt;Task&gt;</code>? Which one should we prefer and when?</p>

<p>Here is a simple console app</p>

<pre><code>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&lt;Task&gt; 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(() =&gt; DoSomethingAsync("no await"));
            await Runner(async () =&gt; await DoSomethingAsync("with await"));
        }
    }
}
</code></pre>

<p>The output is:</p>

<pre><code>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
</code></pre>

<p>So in <code>RunTheDemo</code>, both calls to <code>await Runner(someLambda);</code> appear to do the same thing with the same timing characteristics - both have the correct two-second delay.</p>

<p>Both lines work, so are they exactly equivalent? What is the difference between the  <code>() =&gt; DoSomethingAsync()</code> and <code>async () =&gt; await DoSomethingAsync()</code> constructs? Which one should we prefer and when?</p>

<p>This is not the same question as "should I use <code>await</code> in the general case", as here we are dealing with working async code, with lambdas typed as <code>Func&lt;Task&gt;</code> which are correctly awaited inside the consuming method. The question concerns how those lambdas are declared, and what the effects of that declaration are.</p>