如何避免为异步和非异步方法编写两次相同的代码。 我目前正在使用 ASP.NET,所以我目前在请求线程上,我很快了解到他在代码下方(应该显示我的意图)绝对是错误的做法。
应用程序死锁,因为 await 关键字试图返回到 .Result 阻塞的同一个线程。
我这样做的全部原因是为了避免两次编写相同的“FindAll”代码。
public IEnumerable<Resource> FindAll()
{
return FindAllAsync().Result;
}
public async Task<IEnumerable<Resource>> FindAllAsync()
{
return await Context.Resources.ToListAsync();
}
那么如何解决这个问题呢?
最佳答案
How do you avoid writing the same code twice for an async and a non async method.
在一般情况下,你不能。
所讨论的操作要么是自然异步的,要么是自然同步的。在这个例子中(一个数据库请求),自然是异步的。因此,使 API 异步。就是这样。
Stephen Toub 有一对著名的博客文章 Should I expose synchronous wrappers for asynchronous methods?和 Should I expose asynchronous wrappers for synchronous methods?对这两个问题的简短回答是“否”。
您可以进行各种 hack 来公开这两种类型的 API(Stephen 在他的帖子中介绍了每种方法),但与缺点相比,好处微不足道。
关于c# - 使用 Async 避免重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23932885/