译自:http://blogs.msdn.com/kushals/archive/2010/04/07/wf3-design-time-performance-ii.aspx
最近,一个客户的设计器在启动的时候非常慢,他的项目只是一个中型的,因此性能的下降是令人非常费解的。
为了找出是哪里的问题,我使用附加到进程方式将含有工作流设计器的实例附加到VS中,并且打开所有异常,然后我尝试启动工作流设计器发现…
我得到了数百个文件IO找不到的异常,难怪性能会这么慢。
我尝试重新编译项目,并检查客户是否少了什么。但是项目生成成功,没有任何错误。是什么导致设计器的性能这么慢呢?
问题如下:
如果工作流中的活动依赖程序集A(使用其中的一些类型),程序集A依赖于程序集B。在设计时,当你装载工作流的时候,活动实例就会被创建。在活动实例创建其间,CLR想要确保活动程序集以及所有他依赖的程序集都能被装载(A和B),为了这个目的,VS的类型解析服务会根据活动程序集来查找A和B,然后还会查找GAC。
如果在这些路径中仍然找不到,他将会使用程序集A和B的部分名字执行Assembly.Load动作。这就意味着如果程序集的1.0.0.版本没有找到,他将尝试1.0.0.1版本。同样的,如果culture=neutral的程序集找不到,他会查找Specific Windows或Framework Culture。这仍然会根据CLR装载程序集的算法有不同的变化。因此,你可以想象每个程序集都有大量的文件没有找到,同样当需要多个程序集的时候在工作流设计时创作环境中就会无法找到。
因此,除了在前面文章的Tips,请使用附加到进程方式将含有工作流设计器的实例附加到VS中,并且观察是否有大量的文件无法找到的异常。如果有,请确保必要的程序集在VS的探测路径中,并查看是否有性能上的提高。
请关注后续文章。