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

时间:2016-05-18 21:13:47

标签: c# asynchronous async-await task-parallel-library

我想简化存储库代码,并希望使用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);
            }
        }
    }

}

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

1 个答案:

答案 0 :(得分:8)

实际上所有3 GetAsync条款都很好(我个人会使用GetAsync1),你所拥有的是ExecuteAsync中的错误

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

等待func的输出,在函数完成它之前,你不会处理上下文。