我正在开发一个 MVC 网络应用程序,它允许我通过网络服务异步管理我的数据。
据我了解,这允许访问运行此网站的服务器的应用程序池的 CPU 线程在发出请求后返回到应用程序池,以便它们可以用于服务其他请求而不会停止整个线程。
假设我的理解是正确的(尽管可能措辞不当),我开始考虑什么时候应该await
事情。考虑以下功能:
public async Task<ActionResult> Index()
{
List<User> users = new List<User>();
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:41979");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.GetAsync("api/user/");
if (response.IsSuccessStatusCode)
{
users = await response.Content.ReadAsAsync<List<User>>();
}
}
return View(users);
}
我的所有函数看起来都很相似,只是它们对网络服务返回的数据执行不同的操作,我想知道,我不应该也等待返回吗?
类似于:
return await View(users);
或
await return View(users);
我的意思是网站到目前为止运行良好,除了我对网络服务应该发送回客户端网站的确切内容有点困惑,但因为我是涉及网络服务的开发新手,我仍然想知道我是否正在正确地做事,这已经困扰了我一段时间。
最佳答案
您只能等待通过 Task
公开异步操作的命名或匿名方法和 lambda 表达式, Task<T>
或自定义服务员。自 View
它本身不执行任何异步操作,您不能等待它。
使用 await
的实际意义是什么? ?通常,您有一些 IO 绑定(bind)操作,这些操作本质上是异步的。通过使用异步 API,您可以通过返回线程池让线程不受阻塞,利用它来处理不同的请求。 async
不会改变 HTTP 的性质。它仍然是“请求-响应”。当 async
方法让出控制权,它不会向客户端返回响应。它只会在操作完成后返回。
View(object obj)
返回 ViewResult
,这反过来会将您的对象转换为所需的输出。 ViewResult
不可等待,因为它不会通过可等待对象公开任何“ promise ”。因此,您不能异步等待它。
关于c# - 使用异步 Web 服务时,什么应该 "await"什么不应该?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31588813/