Silverlight线程及其用法

时间:2010-03-11 13:00:19

标签: silverlight silverlight-3.0 multithreading

场景:我正在处理LOB应用程序,因为在Silverlight中,每次调用服务都是Async,因此在服务器端处理请求时,UI不会被阻止。

Silverlight还支持线程,根据我的理解,如果你正在开发LOB应用程序线程,当你需要做一些IO操作时最有用但是因为我没有使用OOB应用程序,所以无法访问客户端资源和所有服务器请求它默认为Async。

在上面的场景中是否有线程的使用,或者任何人都可以提供一些好的例子,通过使用线程,我们可以提高性能。

我试图在这个主题上进行大量搜索,但在任何地方我都发现了一些简单的线程示例,从中很难理解真正的好处。

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

Tomasz Janczuk还pointed out,如果UI线程相当繁忙,即使是异步WCF调用,也可以通过将它们编组到一个单独的线程上来显着提高性能。我应该注意到,UI线程可能会非常繁忙地做一些你不会预料会咀嚼循环的事情,比如计算阴影和什么不是,所以这可能值得为你的应用程序调查(和测量)。 / p>

也就是说,我在二十年的大部分时间里都在编写LOB应用程序,除了同步IO之外,我还没有发现很多场景,在LOB应用程序中添加多个线程值得额外的复杂性。 / p> 编辑4/2/10:前几天我和Tomasz Janczuk以及WCF团队的其他人共进午餐,他们为我解释了一些关于WCF如何与Silverlight后台线程配合使用的问题。有两件事需要关注:发送数据和接收数据(例如,从双工回调或异步呼叫完成)。发送数据时,将始终从实际进行呼叫的线程进行呼叫。因此,如果您有大量需要序列化的数据,则可以通过将传出调用封送到后台线程(例如,使用ThreadPool.QueueUserWorkItem)来获得较小的性能提升。但它不太可能是一个显着的性能提升。

但是,当您通过双工回调或异步xxxCompleted方法接收数据时,始终会在最初打开连接的线程上接收数据。这意味着如果您明确打开连接,它将在该线程上接收数据;但如果您隐式打开连接,它将在您进行第一次出站连接的线程上接收数据。如果您需要在每次回调时更新UI,这不会产生很大的不同,因为您只需要将回调编组回UI线程。但是,如果有时您只需要存储数据以供将来参考或处理,您可以通过在单独的线程上打开连接来获得显着的性能提升,这样您就可以在不等待UI线程的情况下接收和处理回调

希望这会有所帮助。我以为我会把它写下来,而我脑子里仍然有相当新鲜的感觉。

答案 1 :(得分:0)

同样的优势适用于Silverlight和其他应用程序。如果你在客户端进行长时间运行计算并且不想占用main / ui线程,那么线程是一个明显的选择。

另外,我还没有研究过它,但我想如果你运行的是多核机器,你可以通过将工作分成多个单独的线程来提高性能。