0
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);  
}  
4

2 回答 2

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介绍很有帮助。

于 2013-11-10T13:06:24.590 回答
2

正如您所说,为了使其异步,您应该确保您的方法中有一个异步调用,否则不会有任何区别。

如果你像你给出的第二个例子那样做,你将有一个异步方法。但是请注意,这根本不会影响客户端。它唯一要做的就是在执行数据库调用时释放服务器上的一个线程。

于 2013-11-10T11:18:40.147 回答