在单独的线程上初始化组件性能

时间:2015-12-03 15:16:52

标签: c# .net wpf

我们在创建的WPF自定义控件的InitializeComponent方法中遇到了一些不良的性能,包含大约10个UI元素。

此自定义控件用于在另一个STA线程中创建FixedDocument。当一些其他UI元素(在主UI线程上创建的页面)在FixedDocument创建之前被实例化时,会出现问题。

如果用户之前导航到某些页面,则会出现问题,否则一切都会正常。

我不知道为什么会这样,但我们确定问题出在InitializeComponent方法调用上,大约需要2秒才能完成。

该应用程序的平均内存使用量约为100 MB,并且创建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线程(主UI和我自己的线程)同时运行有什么问题吗?

谢谢,

1 个答案:

答案 0 :(得分:0)

我弄清楚如何修复。我的自定义控件引用了本地化扩展(http://wpflocalizeextension.codeplex.com)。

我删除了此引用,现在一切正常。

但是,不知道为什么这个扩展会导致问题。我不得不在ViewModel类上进行字符串本地化。