c# - 即使按顺序发送,HTTP 服务器是否有可能无序接收请求?
问题描述
(这个讨论可能不是特定于 C#...)
我有一个 C# 方法SendMultipleRequests
,可以按顺序发送 10 次 HTTP POST 请求。服务器是否可以乱序接收请求?
如果我的理解是正确的,如果请求是同时发送的(不await
带将按顺序接收请求。
public async Task SendRequest(int i)
{
// definition of endpoint is omitted in this example
var content = new StringContent($"I am {i}-th request");
await HttpClient.PostAsync(endpoint, content);
}
public async Task SendMultipleRequests()
{
for (int i = 0; i < 10; i++)
{
await SendRequest(i);
}
}
解决方案
与await
您的应用程序将等待 PostAsync 返回的任务在发出下一个请求之前完成 - 请参阅 postasync 文档,其中显示“此操作不会阻塞。返回的Task<TResult>
对象将在读取整个响应(包括内容)后完成。” - 使用 await 意味着你只会在我阅读了上一个响应的内容后发出下一个请求
如果您删除等待,那么您的代码将排队十个任务并开始以某种未定义的顺序处理它们。服务器将以未指定的顺序查看请求。请求可能通过 Internet 采用不同的路由(速度较慢)这一事实可能会进一步加剧这种情况。如果您删除等待,那么您应该将返回的任务捕获到一个列表中,然后您可以使用类似 await Task.WhenAll(list) 的东西来等待它们全部完成(除非您真的想触发并忘记在这种情况下您可以将它们分配给丢弃_ = client.PostAsync...
,但保留任务允许您发现和处理出现的异常)
推荐阅读
- android - BroadcastReceiver中的Android startActiviy
- excel - 在 Excel 的列块中附加键控行值
- java - 如何在 ViewHolder RecyclerView 适配器中单击时关闭底部表?
- html - Unicode可以在标签的'src'属性中使用而不是路径
- r - 如何通过 R 中的 gt 表按升序(1 月、2 月、3 月)显示我的月份?
- javascript - 完成后的倒计时动作
- node.js - NodeJS 中使用 Async/Await 的顺序分类账条目
- xamarin - xamarin 最新预发布版 5.0.0.1791 中未显示主详细信息汉堡包图标
- sql - case statement using regex like in oracle db
- android - Could not get unknown property 'defaultCompileSdkVersion' for project ':app' of type org.gradle.api.Project