Silverlight 4 WCF Ria Services的轮询模式

3
我正在使用Ria Services创建一个Silverlight应用程序,一旦服务调用启动,可能需要相当长的时间。我已经寻找了增加WCF服务超时时间的方法,但是越想越觉得这不是正确的方法。
我更愿意调用DomainContext并立即返回,然后让客户端轮询服务器以查找长时间运行的查询何时完成。
我正在寻找实现此类功能的良好方式或示例。一个可能的问题是Web服务不应在服务调用之间保持状态,但这正是我要做的事情。
有什么想法吗?
谢谢,
-Scott
3个回答

1

我目前正在使用WCF服务的Ria服务,但看起来需要进行大量重构才能使其正常运行。由于我遇到的问题,我可能永远不会再使用Ria了,但是我需要坚持使用它来完成这个项目。通过在服务器上创建单例并生成多个线程,我能够接近解决方案,但是一旦调用线程返回到服务,ObjectContext就被处理掉了,当访问实体时,我的工作线程也会停止。我真的陷入了困境。 - Scott
@Scott:即使你解决了这个问题,当你有多个客户端同时轮询时,你也不知道要向每个客户端返回什么。 - jweyrich
我正在为每个请求将事务分解的调用者分配一个令牌。然后客户端使用该令牌轮询服务器以查看结果是否已经到达。我基本上将结果保存在堆中,直到客户端获取它,或者被另一个保持清洁的进程删除。这在纸上看起来很好,但是当调用线程离开服务时失去ObjectContext并不是我所期望的。谢谢回复...今晚会很漫长... - Scott
@Scott:所以你正在寻找一种克隆/复制ObjectContext实例的方法?这显然可以解决你描述的问题。我现在得退出了。但请告诉我们你是如何/是否解决了这个问题。祝你好运! :-) - jweyrich

0

你能让服务调用时间更短吗?如果不能,为什么?

通常情况下,当查询需要这么长时间时,要么是因为最后运行的SQL不够高效,要么是因为SQL服务器的索引不好,或者客户端请求的数据量远远超过了他们在短时间内实际使用的量。

例如,不要一次性请求500个实体并显示一个大列表/DataGrid/等等,而是每次请求10-50个,并有一个分页UI,只有在用户需要时才请求下一批数据。


不幸的是,我正在搜索一个搜索索引,根据搜索词可能会带回数千行结果。我无法在查询中“跳过”X个结果,否则我将实现某种分页系统。我确实需要所有结果——如果不能立即获取,则需要在短时间内进行搜索后获取。这就是为什么我想到可以在服务器上保存完整查询状态,并在完成时返回来获取它。我同意你的看法,一次性带回这么多数据太多了,但我找不到其他方法。有其他建议吗? - Scott
是因为您无法控制正在查询的搜索索引吗?在这种情况下,我认为“最RIA服务方式”应该是增加超时时间,而不是轮询 - DomainContext将需要更长的时间来填充,因此您的UI应该在LoadOperation进行中具有某种指示器,但最终它将通过INotifyCollectionChanged事件等来更新UI。 - Austin Lamb
当然,我建议您与您查询的索引的所有者交谈,并让他们知道“嘿,我将请求比我需要的数据更多,这将浪费您大量的带宽等资源...如果您能以分页方式向我公开数据,那对我们双方都更好”,看看他们会说什么。也许他们会同意,因为这将使您和这个索引的任何未来客户受益 :) 提出请求永远不会有坏处。 - Austin Lamb

0

看一下 SignalR,它可以和 RIA 并行运行,让你从服务器向客户端推送消息。


我有一个类似的情况,涉及到WCF RIA和Silverlight。你有没有任何示例代码,可以展示如何将SignalR与WCF RIA并行使用? - user636525
看看这个样本,他们还有一个适用于Silverlight的版本。 - Eugene Tolmachev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接