也许你可以在这里帮助我。更重要的是理解。
我有一个可以通过 http://localhost:port/person/200 调用的 Web 服务。 (200 是该人的 ID)。 当我在浏览器中执行此操作时,我会返回一个也显示的 XML。 XML 由大约 30 个元素组成。
我有一个应用程序,在其中使用 HTTPClient 调用 URL 并获取 XML 作为对象。现在我的想法是,由于我最近需要检索 1000 或更多人,因此并行执行调用。到目前为止只有几个人,我已经陆续检索到了不同ID的URL。
foreach (var personId in Class.NameOfTheListWithIDs.Chunk(50))
{
await CallAMethod(personId, httpClient);
}
为了并行性,我有一个 Foreach 循环,在其中运行一个列表(使用 .Chunk(50))并使用 async/await。
如果我像 Foreach 循环一样在应用程序中这样做,会出现什么危险/问题?我注意到了一个问题,但我还不想提及它,因为我对您的答案感兴趣并且不想超出自己。
以并行性的方式创建 WebService 是否很常见?换句话说,当我从数据库中获取 ID 的数据时,此时是否插入 async/await 或 Task.RUN 或类似的内容?或者我不需要 Web 服务,因为应用程序通过并行性来调节这一点?一切都与网络服务保持同步吗?
谢谢您的回答。
我的建议是更新您的网络服务以一次接受多人的请求。每个请求都会有一定的开销,这适用于网络服务器和数据库。因此,您通常希望最大程度地减少请求量。您希望将其转换为类似于
SELECT * FROM persons WHERE id IN( id1, id2, ... )
的 SQL
发布的示例是异步的,但不是并行/并发的。对
CallAMethod
的每次调用都将在前一个调用完成其任务后执行。
您可以同时发出多个请求,但扩展将高度依赖于可用资源。在一定程度的并行性下,吞吐量完全有可能下降。如果您想并行进行调用,您可能需要使用类似 Parallel.ForeachAsync 的东西,因为这应该提供一种方便的方法来限制并行量。
Web服务器通常独立并发地处理请求,并使用数据库进行同步。客户端和服务器之间没有自动“同步”,它只是来回传递消息。如果您想确保客户拥有最新的数据,您需要为此构建某种系统。