我有一个大约10万用户的列表,我需要为他们中的每一个执行同步WCF呼叫,我需要尽快完成列表.根据服务器状态的不同,每次WCF调用大约为200ms-1s.我想用Parallel.For英镑,但有没有更好的办法?

推荐答案

阻塞IO并不难于并行化,因为它占用了线程,而且线程的开销相对较大.此外,如果所有工作都转到相同的后端,增加并行度通常可以提高性能,因为这会增加服务器的管理费用并遇到瓶颈.

IMO这里真正的问题是工作单元的大小,在这里听起来您需要 for each rexord执行一个API调用;as close to the backend as possible0批(比方说)as close to the backend as possible个记录通常比as close to the backend as possiblek单个操作的性能要高得多.如果是我,我会考虑将其重构为批处理API.如果底层服务无法更改,另一种 Select 是运行编排服务as close to the backend as possible(理想情况下,相同的框),该服务至少可以接收批并在本地展开它们,从而最大限度地减少延迟开销.但是请注意,如果延迟不是当前问题的一个重要因素,这将无济于事:如果200ms-1s仅仅是由于服务器实现缓慢,那么you probably can't do much to work around that(可能除外...投入时间让它变得不那么慢).

这里的第二个关注点是异步;异步可能很重要(尤其是服务器端),但在这种情况下,它不是我关注的重点.

.net相关问答推荐

.NET Blazor-使用子组件中的处理程序方法进行双向数据绑定

.NET发布的应用程序运行与开发不同的端口

.NET最小API BadRequest响应不返回正文

如何通过在后台预加载流项来优化流迭代的性能?

向从 .NET 序列化的对象添加 Xml 属性

如何使用 awslocal 通过 localstack 中的 cloudwatch events/eventbridge 触发 lambda

部署时如何控制红隼端口?

如何判断属性设置器是否公开

Web API 中基于令牌的身份验证,无需任何用户界面

.NET 应用程序的链接器状态(又名请先生,我可以有一个链接器2009 年版)

mstest.exe 在哪里?

如何删除只读文件?

是什么让 Enum.HasFlag 这么慢?

有什么方法可以在不重新编译的情况下覆盖 .NET Windows 服务名称?

如何在 RabbitMQ 中设置重试次数?

.Net 中 AOP 的最佳实现是什么?

在 WPF DataGrid 中绑定 ComboBoxColumn 的 ItemsSource

使用 LINQ 搜索树

从 Visual Studio 2015 发布 - 允许不受信任的证书

多行 C# 插值字符串文字