Q:

Difference between passing a regular and async anonymous function to Task. Run for asynchronous work

What is the difference between
ResultType result = await Task. Run(() => GetResultAsync())

and
ResultType result = await Task. Run(async() => await GetResultAsync())

I would speculate that the former would fire and forget GetResultAsync(), since it is not awaited, but then how does it get the result?  I am surprised that the return type of the formerTask. Run is Task<ResultType> and not Task<Task<ResultType>>. 

A:

Both do the same from perspective of result.  In both cases the overload Task. Run<TResult>(Func<Task<TResult>> function) is used which internally unwraps the task - that's why result is Task<ResultType>.  The difference between them is equiavalent to the difference between
    static Task<T> Compute()
    {
        return GetAsyncResult();
    }

and
    static async Task<T> Compute()
    {
        return await GetAsyncResult();
    }

In the first case the promise is just passed back to the caller, while in the second the state machine is built by compiler around the Compute method.