【发布时间】:2012-02-23 14:36:34
【问题描述】:
我有一个用 C# 编写的 WPF 应用程序。它必须实例化数千个对象。从数据库服务器提取数据后,它必须运行大量需要时间的计算。整个过程需要 20-30 秒,其中 80% 来自计算。
因此,为了帮助解决此问题,我编写了一个 WCF 服务,该服务保留已实例化对象的副本以及已运行的计算,然后根据请求将实例化对象传输到调用客户端。
有效!然而它很慢......真的很慢。比原来的方式慢很多。从 WCF 服务传输所有对象需要 3-4 分钟,从而违背了它的目的。
我尝试过流式传输而不是缓冲服务,并在客户端和服务器配置文件中增加或减少不同的服务选项,但还没有找到真正有用的设置。
这是意料之中的缓慢速度,还是应该很快,我只需要修改一些选项?如果有,有哪些选择?
【问题讨论】:
-
这可能归结为序列化。您使用什么协议端点?物体有多大?
-
我使用 BasicHTTPBinding。对象使用 [Serializable] 属性进行序列化。所有对象的总大小约为 350 MB。
-
我对 WCF 的建议是只通过网络传递所需的数据。正因为如此,我经常使用仅包含原始数据的
DTO或POCO对象,以使进出 WCF 的数据尽可能小。 WCF 将比在本地运行项目要慢,因为它必须去服务器并获取其数据,而不仅仅是从内存中提取数据。您正在运行哪些类型的计算,而不能只将计算结果存储在对象本身上? -
如果这一切都发生在“内部”(即不是 Web 服务),则可能值得尝试使用套接字或命名管道,因为这会将您的对象序列化为二进制而不是 XML/文本。
-
是的,@Rachel 也是这么说的。确保只序列化需要传输的值,如果可以的话,可能会创建轻量级对象。
标签: c# wpf wcf web-services