数据层中的异步是否要求整个调用堆栈也是异步的?

时间:2017-01-23 21:29:44

标签: c# .net asynchronous architecture async-await

目前,数据层与数据库异步交互是很常见的:

public async Task<Customer> GetCustomer(int id)
{
  using (db = new AppDbContext())
  {
    return await db.Customers.FindAsync(id);
  }
}

使用这种技术,我的理解是所有调用方法,一直到UI层,然后也必须使用async关键字定义。因此,您最终会得到一个应用程序,其中最终与数据库交互的每个方法或函数都是异步方法。

这似乎非常混乱,污染&#34;所有应用层都了解数据层内的实现细节。

我误解了什么,或者这只是一个人必须做的事情?

1 个答案:

答案 0 :(得分:5)

  

我误解了什么,或者这只是一个人必须做的事情?

不,你是对的。这只是你必须要做的事情。

  

这似乎非常混乱,污染&#34;所有应用层都了解数据层内的实现细节。

是的,这些实施细节确实泄漏了,这很不幸。它只是绝大多数计算机语言如何运作的现实。

我倾向于将async详细信息与IDisposable详细信息进行比较。如果一个类实现IDisposable,那么它包含(拥有)类应该等等。但是一个类是否拥有资源应该真的是一个实现细节。