在我们的.NET 4.0 Winforms应用程序中,当应用程序使用以下代码保存其设置时,一些用户(全部为Win7 x64)最近经历了非常长的等待时间(与其他用户相比):
Properties.Settings.Default.Save();应用程序设置(作用域: User,在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" />其中的持续时间几乎都被分成三个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秒)来枚举printersettings对象的papersizes或纸质集合。
使用一个小型测试应用程序--仅仅保存PrinterSettings --显示在其中一台“慢”机器上节省了大约3.5秒的时间,而另一台则对与我的快速开发机器对应的0.2秒的持续时间印象不深。
对原因及如何改进有何看法?
我怎样才能找到造成这些延误的真正原因?
编辑:感谢您指出打印机设置是通过驱动程序获得的,这可能解释了某些机器上的延迟。
在机器上更新打印机驱动程序是不可能的,而我将来在任何地方都无法访问这些驱动程序。
而且,我不会(我知道)减少要保存的PrinterSettings信息,仅仅因为有些人可能会遇到滞后,最终破坏向后兼容性。
也许,如果我尝试在后台序列化(在用户做了一些打印机更改之后?)它可能会加速事情..。
发布于 2014-11-19 15:47:10
因此,似乎有些机器需要很长时间通过已安装的驱动程序查询页面和打印机设置。我找不到更多的细节了。
为了缩短关闭时间,在用户更改打印机设置后,将在后台线程中分配和保存上述设置的部分。这大约需要10秒。
在关闭(窗体关闭)期间,这些设置是而不是再次分配的,但是我们仍然保存所有(使用Properties.Settings.Default.Save()),并且序列化程序不知何故认识到它们没有需要查询的更改,因此保存完成得非常快:
在0.02和0.05秒之间,但仍然所有的设置都保存正确!
有趣的事实:这个问题第一次报道是在本周,当时我们有了一台新的办公室打印机:)
https://stackoverflow.com/questions/26996238
复制相似问题