c# - 使用 Async 避免重复代码

标签 c# .net 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();
}

那么如何解决这个问题呢?

最佳答案

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/

相关文章:

c# - 在Unity中使用音频频谱C#脚本更改Trail Renderer的宽度参数

c# - BackgroundWorker 中未处理的异常

c# - 什么是NullReferenceException,如何解决?

c# - ASP.Net MVC 如何用浏览器中无法解析的内容替换 HTML 标签

javascript - 如何在网页上保持 SignalR 连接?

c# - Web API未接收序列化对象的json

c# - 值在 ComboBox 中不可见

c# - 查询 IEnumerable 中具有相似属性且在特定时间阈值内的对象

c# - 如何获取带有名称和任何扩展名的图像?

.net - 自定义 WCF DataContractSerializer