使异步成为我现有的API

时间:2013-11-10 05:48:26

标签: c# asp.net-web-api async-await

public **HttpResponseMessage** GetContacts()  
{  
   var result = db.Contacts().ToList();  
   return this.Request.CreateResponse(HttpStatusCode.BadRequest, result);  
}  

要调用此ASYNC,是否足以添加“async Task<>”回电话:

public **async Task<HttpResponseMessage>** GetContacts()  
{  
   var result = db.Contacts().ToList();  
   return this.Request.CreateResponse(HttpStatusCode.BadRequest, result);  
}  

或者因为它也在调用数据库,所以我必须使所有/部分内部调用异步:

public **async Task<HttpResponseMessage>** GetContacts()  
{  
   var result = **await** db.Contacts().ToList();  
   return this.Request.CreateResponse(HttpStatusCode.BadRequest, result);  
}  

2 个答案:

答案 0 :(得分:3)

您应该只在需要时使用async。通常,通过首先更改最低级别来最好地工作;即,在代码中找到阻塞方法并使它们首先异步。

所以,启动代码如

public HttpResponseMessage GetContacts()
{
  var result = db.Contacts().ToList();
  return this.Request.CreateResponse(HttpStatusCode.BadRequest, result);
}

要改变的第一件事是ToList,它会变成ToListAsync并等待着:

public HttpResponseMessage GetContacts()
{
  var result = await db.Contacts().ToListAsync();
  return this.Request.CreateResponse(HttpStatusCode.BadRequest, result);
}

然后,因为您使用的是await,所以您的方法必须标记为async

public async Task<HttpResponseMessage> GetContactsAsync()
{
  var result = await db.Contacts().ToListAsync();
  return this.Request.CreateResponse(HttpStatusCode.BadRequest, result);
}

您可能会发现我的async intro有帮助。

答案 1 :(得分:2)

正如你所说,为了使它异步,你应该确保你的方法中有异步调用,否则没有区别。

如果您在第二个示例中执行此操作,则将使用异步方法。但请注意,这根本不会影响客户端。它唯一能做的就是在数据库调用执行时释放服务器上的一个线程。