В нашем приложении .NET 4.0 Winforms некоторые пользователи (все Win7 x64) недавно испытали очень долгое время ожидания (по сравнению с другими), когда приложение сохраняет свои настройки с помощью этого кода:Сохранение пользовательских настроек .NET занимает очень много времени
Properties.Settings.Default.Save();
- Типичные длительности: от 0,5 до 1 секунды
- Экстремальные длительностей: от 15 до 20 секунд
приложений настройки (объем: Пользователь, все сохраняется в User.config под AppData \ Local \\) состоит из нескольких пользовательских классов, а также два класса, представляющих параметры принтера: 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" />
, продолжительность была почти поровну на три геттеров (взятых из зрителя GlowCode):
- PrinterSettings :: get_PaperSizes
- PrinterSettings :: get_PaperSources
- PrinterSettings :: get_PrinterResolutions
Doing некоторые исследования показали следующие страницы: 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, требуется навсегда (от 5 до 15 секунд, если скомпилировано за x64, 10-20 секунд, если скомпилированный для x86), чтобы перечислить либо в документе, либо в виде документов, которые собирают объект printersettings.
С помощью небольшого тестового приложения просто экономия PrinterSettings показал экономию времени около 3,5 секунд на одном из этих «медленных» машин, в то время как другой был совсем не впечатлен длительностью 0,2 секунды, что соответствует моей быстрой машине развития ,
Любые идеи о причинах и о том, как улучшить это?
Как я могу найти реальные причины этих задержек?
Редактировать: Спасибо, что указали, что настройки принтера получены через драйвер, это может объяснить задержки на определенных машинах.
Обновление драйверов принтера на машинах, к которым я не могу получить доступ в будущем, когда это будет установлено, невозможно.
Кроме того, я не буду (я знаю, я знаю) уменьшить информацию PrinterSettings быть сохранены только потому, что некоторые люди могут испытывать задержку и разорвать обратную совместимость в конце концов ...
Может быть, если я пытаюсь сериализации в фоновом режиме (после того, как пользователь выполнил некоторые изменения в принтере?) Это может ускорить вещи ...
Я подозреваю, что PrinterSettings объект должен повторный запрос принтера для его информации, и что это медленно. Почему вы должны сохранить объект PrinterSettings?Данные, полученные от него, могут измениться, если физический принтер изменится. Вероятно, лучше не кэшировать эту информацию. –
Во-первых, Добро пожаловать в переполнение стека! Во-вторых, +1 для очень хорошо написанного первого вопроса! Вы ясно сделали много исследований в этом уже ** И ** задокументировали это. –
У меня есть проект, который делает то же самое, по большей части, и без проблем. В машине, ведущей на работу сейчас, я могу выкопать ее и опубликовать ее позже этим утром. Тем не менее, в vb. Если я правильно помню, это связано с использованием пользовательской оболочки, которая сериализовала каждый бит по-разному. – pinkfloydx33