考虑一个具有UI(Controller),业务层和DataAccess层的Web应用。
假设要获取员工列表,则呼叫要遍历所有三层,如果我们将其设为异步调用,那么在我们将其设为高效异步的情况下,调用流程中这三层中的所有方法是否都将进行异步处理打电话吗?
答案 0 :(得分:2)
从调用异步的第一个方法到实际需要执行异步操作的最后一个方法的整个链都必须是异步的。
因此,在您的情况下,异步操作最有可能在数据访问层中。 DAL将从业务层调用。而且BL将从您的UI控制器中调用,因此它们都需要异步。
没有理由使方法成为任意异步方法,很可能您将拥有不调用任何其他异步方法的方法,因此它们本身不需要异步。
另一种不应该使方法异步的情况是,您只是在不等待任何内容的情况下返回任务。
答案 1 :(得分:0)
简而言之,是,一路异步! 特别是不要使用阻塞代码!阻塞代码(与异步代码混合在一起)可能会在运行时引起各种问题(例如死锁,异常困难等)。 参见此MSDN Magazine Article。
详细来说,只有必须await
(即等待完成,检查是否已取消,检查是否有故障,检索结果)的方法才是async
。仅返回Task
或Task<T>
而未观察其Status
的方法不应异步以避免开销。但是最终,您至少必须等待顶层代码(例如UI)才能检索结果和/或观察Task是否已成功运行完成。
并且,按照惯例,您应始终在异步和/或任务返回方法的名称后附加“异步”。另请参见docs和Stack Overflow。