避免使用Async重复代码

And*_*ock 13 .net c# asp.net-mvc async-await

如何避免为异步和非异步方法编写相同的代码两次.我目前正在使用ASP.NET,因此我目前正在使用请求线程,并且我很快就知道他在代码下面(应该显示我的意图),这肯定是错误的做法.

应用程序死锁,因为await关键字试图返回.Result阻塞的同一线程.

我这样做的全部原因是避免两次编写相同的"FindAll"代码.

public IEnumerable<Resource> FindAll()
{
   return FindAllAsync().Result;

}

public async Task<IEnumerable<Resource>> FindAllAsync()
{
   return await Context.Resources.ToListAsync();
}
Run Code Online (Sandbox Code Playgroud)

那你怎么解决这个问题呢?

Ste*_*ary 12

如何避免为异步和非异步方法编写相同的代码两次.

在一般情况下,你不能.

有问题的操作要么是自然异步的,要么是自然同步的.在此示例(数据库请求)中,它自然是异步的.因此,使API异步.就这些.

Stephen Toub有一对着名的博客文章我应该为异步方法公开同步包装器吗?我应该揭露异步包装器同步的方法呢?对这两个问题的简短回答是"不".

你可以做各种黑客来暴露这两种类型的API(斯蒂芬在他的帖子中涵盖了每种方法),但与缺点相比,其好处是微不足道的.