首页 / 软件开发 / .NET编程技术 / 性能优化总结(五):CSLA服务端如何使用多线程的解决方案
性能优化总结(五):CSLA服务端如何使用多线程的解决方案2012-05-26 博客园 BloodyAngel前篇说到了使用异步线程来实现数据的预加载,以提高系统性能。这样的操作一般是在客户端执行,用以减少用户的等待时间。客户端发送多次异步请求,到达服务端后,如果服务端不支持多线程处理 操作,线性处理各个请求,必然导致客户端的异步请求变得没有意义。大家肯定会说,谁会把服务端设计成单线程的啊,那不是明显的错误吗?是的!但是我们的系统使用了CSLA来作为实现分布式的框架, 而它的服务端程序却只能支持单线程……这个问题我们一直想解决,但是查过CSLA官方论坛,作者说由于GlobalContext和ClientContext 的一些原因,暂时不支持多线程。火大,这还怎么用啊!无奈目前系统已经极大地依赖了这个框架,一时半会儿要想换一个新的,也不太 现实。所以只好自己动手修改CSLA里面的代码了:修改WCF通信类要修改为多线程的服务端,首先得从服务端的请求处理处入手。.NET3.5的CSLA框架使用WCF实现数据传输。它在服务器端使用这个类来 接收:1 namespace Csla.Server.Hosts
2 {
3 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
4 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
5 public class WcfPortal : IWcfPortal { }
6 }
可以看到,这个类没有标注ConcurrencyMode = ConcurrencyMode.Multiple和UseSynchronizationContext = false,所以已经被设计 为单线程操作。在这里,我们使用装饰模式来构造一个新的类:01 /// <summary>
02 /// 标记了ConcurrencyMode = ConcurrencyMode.Multiple
03 /// 来表示多线程进行
04 /// </summary>
05 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,
06 ConcurrencyMode = ConcurrencyMode.Multiple,
07 UseSynchronizationContext = false)]
08 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
09 public class MultiThreadsWCFPortal : IWcfPortal
10 {
11 private WcfPortal _innerPortal = new WcfPortal();
12 #region IWcfPortal Members
13 public WcfResponse Create(CreateRequest request)
14 {
15 return this._innerPortal.Create(request);
16 }
17 //...
18 #endregion
19 }
同时,我们需要把配置文件和类的实例化两处代码都替换:app.config:1 <services>
1 <!--Csla.Server.Hosts.WcfPortal-->
1 <service name="OpenExpressApp.Server.WPFHost.MultiThreadsWCFPortal" behaviorConfiguration="returnFaults">
2 .....
3 </service>
4 </services>
factory method:1 private static Type GetServerHostType()
2 {
3 return typeof(OpenExpressApp.Server.WPFHost.MultiThreadsWCFPortal);
4 //return typeof(Csla.Server.Hosts.WcfPortal);
5 }