【发布时间】:2018-01-07 08:14:30
【问题描述】:
我有这些领域模型
public class Topic
{
public int TopicId { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public int? TopicId { get; set; }
public virtual Topic Topic { get; set; }
}
例如,我想实现 TestAsync 方法,我想使用 Topic 对象和相关的 Posts 对象。
我可以使用 async 方法和 topicId 作为参数来获得主题模型。
public async Task<bool> TestAsync(int topicId)
{
var topic = await topicService.GetByIdAsync(topicId);
// posts ...
}
我有两种方法,如何获取相关帖子。 但是,如果我使用 LazyLoading 或仅使用另一个异步查询有什么区别?
// Example: 1 (LazyLoading)
var posts = topic.Posts;
// OR Example: 2 (Async method)
var posts = await postService.GetAllByTopicIdAsync(topicId);
所以,我认为 Example:1 将同步工作,并且我失去了 async/await 代码的所有优点。 但是示例:2让我想,那可能是我不知道延迟加载的所有魅力:) 谁能澄清我应该使用什么解决方案以及为什么?谢谢:)
【问题讨论】:
-
坦率地说,异步/等待代码在 ASP.NET 中用于数据库访问的“优势”微乎其微。
-
这不是异步/等待或延迟加载之间的选择恕我直言。可以选择在向数据库触发两个查询(使用延迟加载)或在 sql 中连接(使用 Include 进行急切加载)之间进行选择。
-
David,但在许多文章中,建议使用 async/await 来处理与数据库一起工作的方法,因为此时线程返回到线程池。 Peter,Eager Loading 可以成为一个解决方案,谢谢!
-
原始线程可能会返回线程池,但我希望另一个线程被绘制来服务数据库请求,这最终会抵消大部分好处。不是对于网站,而是对于只有一个“UI 线程”的桌面,将工作委派给线程池会好得多。
-
@romeozor 迁移到异步模型通常是件好事。只是如果您需要阻塞线程来运行查询,您不必太担心。
标签: c# asp.net entity-framework async-await lazy-loading