Мы испытываем небольшую производительность по методу 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 (основным пользовательским интерфейсом и моим собственные) работает в то же время?
Спасибо,
Я думаю, что это просто ошибка размещения кода, вы должны написать код до места ошибки. для получения дополнительной помощи Загрузите код, чтобы мы могли помочь !!! –
Пожалуйста, взгляните на код. –