C#中的异步Func - 正确的异步等待使用

Pet*_*uda 3 c# asynchronous task-parallel-library async-await

我想简化存储库代码,并希望使用Funcs来提供常用功能.现在的问题是基于这个代码:

namespace Test
{
    public class Demo
    {

        public Task<Person> GetAsync1(Guid id)
        {
            return ExecuteAsync(context => context.Persons.GetAsync(id));
        }

        public async Task<Person> GetAsync2(Guid id)
        {
            return await ExecuteAsync(async context => await context.Persons.GetAsync(id));
        }

        public Task<Person> GetAsync3(Guid id)
        {
            return ExecuteAsync(async context => await context.Persons.GetAsync(id));
        }

        public Task<TOut> ExecuteAsync(Func<Context, Task<TOut>> func)
        {
            using(var context = new Context())
            {
                return func(context);
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

这里的问题现在是如何正确调用异步函数.这三种Get方法中的哪一种是正确的?有了第一个,我认为我陷入了僵局,因为它在这一点上悬而未决.2号工作正常,但我认为这里的两个异步/等待是不正确的,因为任务重新包装!?

Sco*_*ain 8

实际上所有3个GetAsync实施细则(个人我会使用GetAsync1),你所拥有的是一个错误ExecuteAsync

public async Task<TOut> ExecuteAsync(Func<Context, Task<TOut>> func)
{
    using(var context = new Context())
    {
        return await func(context);
    }
}
Run Code Online (Sandbox Code Playgroud)

通过等待func你的输出,在函数完成它的工作之前不要处理上下文.