c# - 使用异步 Web 服务时,什么应该 "await"什么不应该?

标签 c# multithreading web-services asynchronous async-await

我正在开发一个 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/

相关文章:

java - AJAX 到 Web 服务设计 : Request for Commentary

c# - 返回派生类作为基泛型类

c# - Blazor 服务器 - 从当前登录用户获取 AAD 访问 token

c# - 如何避免 NullReferenceException?

c# - 自旋锁和只读字段

c# - 如何使动态生成的 .net 服务客户端从 *.config 文件以外的其他位置读取配置

c# - 具有多个项目的统一网格控件 C# WPF

wpf - WPF 应用程序的多线程策略所需的建议

c# - 使用 C# 读取数百万个小文件

javax.naming.NamingException : Failed instantiate InitialContextFactory org. jboss.naming.remote.client.InitialContextFactory 来自类加载器