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

3

我希望简化我们的代码库,并使用函数提供通用功能。 现在的问题基于以下代码:

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);
            }
        }
    }

}

对我来说,现在的问题是如何正确调用异步函数。 这三个 Get 方法中哪一个是正确的? 使用第一个方法时,我认为会出现死锁,因为它会停在这里。第二个方法可以正常工作,但我认为两个 async/await 不正确,因为任务被重新包装了!

1个回答

8

实际上,所有三个GetAsync实现都可以使用(个人建议使用GetAsync1),你遇到的问题是在ExecuteAsync中存在一个错误。

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

等待func的输出,直到函数完成工作,您才能释放上下文。

哦,我完全没有注意到。那么我并不是完全走错了路。非常感谢你! - PeterLiguda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接