2015-12-03 2 views
0

Мы испытываем небольшую производительность по методу InitializeComponent созданного нами пользовательского элемента управления WPF, содержащего около 10 элементов пользовательского интерфейса.Производительность InitializeComponent на отдельном потоке

Этот настраиваемый элемент управления используется для создания FixedDocument в другом потоке STA. Проблема возникает, когда некоторые другие элементы пользовательского интерфейса (страницы, созданные в основном потоке пользовательского интерфейса) создаются приложением PRIOR для создания FixedDocument.

Если пользователь перейдет на определенные страницы раньше, возникают проблемы, в противном случае все будет хорошо.

Я понятия не имею, почему это происходит, но мы уверены, что проблема заключается в вызовах метода InitializeComponent, для чего требуется около 2 секунд.

Среднее использование памяти в приложении составляет около 100 МБ, а создание FixedDocument не использует гораздо больше памяти.

Вот код, который создает документ:

private Task<string> CreateLabels() 
    { 
     var tcs = new TaskCompletionSource<string>(); 

     Thread thread = new Thread(() => 
     { 
      try 
      { 
       FixedDocument fixedDoc = new FixedDocument(); 

       //Each item is a tinny ViewModel object to populate LabelView 
       foreach (var item in _labelsToPrint) 
       { 
        double pageWidth = 96 * 4.0; 
        double pageHeight = 96 * 2.12; 

        LabelView lv = new LabelView(item); 
        lv.Width = pageWidth; 
        lv.Height = pageHeight; 

        FixedPage fp = new FixedPage(); 
        fp.Width = pageWidth; 
        fp.Height = pageHeight; 

        fp.Children.Add(lv); 

        PageContent pageContent = new PageContent(); 
        pageContent.Child = fp; 

        fixedDoc.Pages.Add(pageContent); 
       } 

       FileInfo tempFile = new FileInfo(System.IO.Path.GetTempPath() + DateTime.Now.Ticks.ToString() + ".xps"); 
       var paginator = fixedDoc.DocumentPaginator; 
       var xpsDocument = new XpsDocument(tempFile.FullName, FileAccess.Write); 
       var documentWriter = XpsDocument.CreateXpsDocumentWriter(xpsDocument); 
       documentWriter.Write(paginator); 
       xpsDocument.Close(); 

       tcs.SetResult(tempFile.FullName); 
      } 
      catch (Exception ex) 
      { 
       tcs.SetException(ex); 
      } 

     }); 

     thread.SetApartmentState(ApartmentState.STA); 
     thread.IsBackground = true; 
     thread.Start(); 
     return tcs.Task; 
    } 

Есть ли какие-либо проблемы с несколькими потоками STA (основным пользовательским интерфейсом и моим собственные) работает в то же время?

Спасибо,

+0

Я думаю, что это просто ошибка размещения кода, вы должны написать код до места ошибки. для получения дополнительной помощи Загрузите код, чтобы мы могли помочь !!! –

+0

Пожалуйста, взгляните на код. –

ответ

0

определяю, как исправить. Мой пользовательский контроль ссылался на расширение локализации (http://wpflocalizeextension.codeplex.com).

Я удалил эту ссылку, и все работает быстро.

Тем не менее, не знаю, почему это расширение вызывает проблемы. Я должен был сделать локализацию строки в классе ViewModel.

Смежные вопросы