在我们的.NET 4.0 Winforms应用程序中,当应用程序使用此代码保存其设置时,一些用户(所有Win7 x64)最近经历了非常长的等待时间(与其他用户相比):
Properties.Settings.Default.Save();
Run Code Online (Sandbox Code Playgroud)
应用程序设置(范围:用户,保存在AppData\Local \\下的user.config中的所有内容)包含多个自定义类以及两个表示打印机设置的类:System.Drawing.Printing.PageSettings和System.Drawing.Printing.PrinterSettings
在其中一台机器上使用GlowCode分析器,我发现以下功能需要17秒:
<Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPrinterSettings_x003A__x003A_Write9_PrinterSettings Nodes="1" Visits="1" percent_in_Child="100.00 %" Time_in_Child="17.456" Time="17.456" Avg._Time_in_Child_="17.456" Avg._Time="17.456" Blocks_net="12" Bytes_net="1024" Blocks_gross="1087" Bytes_gross="494146" />
Run Code Online (Sandbox Code Playgroud)
其中持续时间几乎平均分为三个getter(取自GlowCode查看器):
进行一些研究后发现以下页面:https: //social.msdn.microsoft.com/Forums/vstudio/en-US/8fd2132a-63e8-498e-ab27-d95cdb45ba87/printersettings-are-very-slow 和 http:// www .pcreview.co.uk/forums/papersources-and-papersizes-really-slow-some-systems-t3660593.html,引用:
在某些系统上,特别是Vista x64系统,它需要永远(如果为x64编译,则为5到15秒,如果为x86编译,则为10-20秒),以枚举打印机对象的papersources或papersize集合.
使用一个小型测试应用程序只需保存PrinterSettings就可以在其中一台"慢速"机器上节省大约3.5秒的时间,而另一台则不会留下0.2秒的持续时间,这与我的快速开发机器相对应.
关于原因和如何改进的任何想法?
我怎样才能找到这些延误的真正原因?
编辑:感谢您指出通过驱动程序获取打印机设置,这可能解释了某些计算机上的延迟.
在将来无论何时将无法访问的计算机上更新打印机驱动程序是不可能的.
此外,我不会(我知道我知道)减少要保存的PrinterSettings信息只是因为有些人可能会遇到延迟并最终破坏向后兼容性......
也许如果我在后台尝试序列化(在用户完成一些打印机更改后?)它可能会加速...