WCF服务传递对象缓慢.这正常吗

本文关键字:常吗 缓慢 对象 服务 WCF | 更新日期: 2023-09-27 18:25:29

我有一个用C#编写的WPF应用程序。它必须实例化数千个对象。从数据库服务器提取数据后,它必须运行大量的计算,这需要时间。整个过程需要20-30秒,其中80%来自计算。

因此,为了帮助解决这个问题,我编写了一个WCF服务,它保存了一个已经实例化的对象的副本,其中calcs已经运行,然后根据请求将实例化的对象传输到调用客户端。

它有效!然而它很慢。。。真的很慢。比原来的方式慢得多。从WCF服务传输所有对象需要3-4分钟,因此无法达到目的。

我尝试过流式传输,而不是缓冲服务,增加或减少客户端和服务器配置文件中的不同服务选项,但还没有发现真正有区别的设置。

这种缓慢的速度是意料之中的,还是应该很快,我只需要修改一些选项?如果是,有什么选择?

WCF服务传递对象缓慢.这正常吗

WCF不一定很慢,但如果应用程序设计不正确,应用程序可能会很慢。这可以比作在跑车上装载几千磅的重量。这辆车是一辆速度很快的车,但它并没有得到正确的使用。

首先,我想说的是,你必须尽量减少通过网络发送的数据量(稍后会详细介绍)。一旦上线,如果使用TCP或命名管道而不是HTTP,您将获得更好的性能。请参阅选择运输。HTTP很容易,因为大多数网络都被配置为轻松通过,但它不是为大型数据集设计的。

如果延迟来自计算,那么WCF服务将完成的唯一任务就是将处理从服务器卸载到客户端。最终,如果您计划对服务器进行大量并发请求,这可能是一件好事,甚至是必要的,但正如您所注意到的,这并不一定意味着最终用户的时间更短。你应该重点做的是尽量减少计算时间。

很难给出具体细节,因为您并没有透露太多关于被查询的内容、被返回的内容以及正在进行的计算。然而,通过VisualStudioSQLServer项目将代码从应用程序服务器卸载到数据库服务器,我在处理大型数据集方面取得了令人印象深刻的结果。由于.NET和MSSQL都是在CLR上编写的,因此可以用C#或VB或任何其他CLR语言编写本机数据库对象(如用户定义的函数),并将它们直接部署到数据库中。然后,您可以在查询中使用这些函数,因为它们被编译成本机SQL,所以速度非常快。我已经看到在应用程序中运行C#与在数据库中运行相同函数之间存在数量级的差异。

如果应用程序80%的工作来自计算,那么将其中的某些部分并行化可能是个好主意,例如使用任务并行库。