我有一个C#库做一些文件处理.我创建了一个控制台和桌面应用程序,使用该库并在大约1分钟内处理256mb文件.然后,我创建了一个在
Windows服务中托管的WCF服务,该服务使用相同的文件处理库,但是从网站调用时需要10倍的时间来处理相同的256mb文件. Windows服务正在具有管理员权限的域帐户下运行.
调用WCF服务的开销非常快,但是LoadFile方法需要更长的时间.我尝试在启动过程中增加进程优先级
Process.GetCurrentProcess ().PriorityClass = ProcessPriorityClass.High;
无济于事我在Win7 64位桌面系统(6gb),2003 XP 32bit服务器(4gb)和2008 R2 32bit服务器(4bg)上运行此服务,结果类似.控制台和桌面应用程序在上述系统上大约1分钟内处理文件.该进程似乎没有内存限制并进入swapville.
Windows服务是否以某种方式进行限制?在IIS下运行WCF服务可以获得更好的结果吗?
编辑:我尝试从网站调用库目录,也比控制台或桌面应用程序长10倍.
更新:原来是Log4PostSharp.控制台和桌面应用程序在配置文件中没有任何痕迹的log4net,而网站和Windows服务却没有.有一个log4net TraceAppender默默地吃掉了宝贵的cpu周期.
解决方法
我不明白为什么你所描述的行为正在发生 – 它似乎很奇怪.由于您正在处理内存中较大的文件,垃圾收集器可能会影响它.您可以尝试更改垃圾收集器运行的模式,看是否有任何影响.
垃圾收集器有三种模式 – 工作站,服务器和并发.每个人以不同的方式行事,并针对不同类型的应用进行了优化.工作站模式是默认模式,并且是所有进程运行的,除非配置为使用别的东西.有关模式的更多信息可以找到here.
尝试明确地将垃圾回收器设置为使用服务器模式(它将仅对多处理器计算机有影响).为此,请将以下内容放在您的app.config文件中:
<configuration> <runtime> <gcServer enabled="true" /> </runtime> </configuration>