在非UI线程上运行RIA服务

4

我试图从非UI线程执行RIA服务调用。
我使用了开启新线程和背景工作程序进行调用,但是对于这两种情况,回调都在UI线程上运行。
有可能在调用线程上执行回调,而不是在UI上吗?
谢谢

1个回答

5

简而言之

  • 使用WCF
  • 自己将结果转换到UI线程

WCF RIA旨在在UI线程上执行工作

WCF RIA的设计主要是在UI线程上工作。这显然有许多优缺点,在你的情况下主要是缺点。我很难找到关于这个设计的确切文档,但大多数与此主题相关的问题都通过肯定UI线程性得到回答。

域上下文加载和SubmitChanges以异步方式执行。它们从线程池中获取一个线程,进行必要的服务器调用,当这些调用完成时,工作会自动转换回UI线程,以修改实体集合并随后更新UI(可能通过INotificationChanged)。

如果您使用WCF获取自己的数据,可以在任何线程上执行。当调用完成时,您将需要编写(或借用)代码以在UI线程上更新UI,以避免跨线程异常。
在我看来,WCF RIA的主要优点是提供简单问题的简单解决方案:
- 在服务器和客户端之间重复使用代码的强大工具 - 服务和客户端代码始终兼容 - 相对简单地传输数据到/从客户端/服务器 - WCF RIA的强烈观点导致易于学习的编码模式
缺点使得难以解决困难或不可能的问题:
- WCF RIA非常有见解,不遵循该见解会很痛苦或不可能 - 所有操作都在UI线程上返回,经常导致性能问题 - 存在一些巫术来实现最高数量的客户端+服务器代码重用

感谢您详细的回答。不幸的是,我不能使用WCF,因为我正在处理已经使用RIA的项目,我无法更改那一部分,对我来说唯一的方法就是使用RIA。 - Samvel Siradeghyan
我通过减少对服务器的调用次数获得了更好的性能。你看到的一个调用的延迟会随着每个连续调用呈线性增长。如果你有大量数据,可以尝试分页。祝你好运! - Ed Chapel
我正在绘制类似建筑物模式的东西,并且逐块加载数据,以便最小化数据接收延迟。问题出在数据处理部分,即数据接收时间(我使用Fiddler获取该时间)和完成事件触发之间的时间。 - Samvel Siradeghyan

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