使用STA Thread或TaskScheduler.FromCurrentSynchronizationContext()进行并行编程

时间:2012-01-26 13:30:42

标签: wpf parallel-processing performancecounter sta

我正在编写一个使用WPF控件生成XPS文件的代码。我们说100页文档。我们知道,因为它使用WPF UI元素,所以它必须是STA线程。 从前端开始,我有一个Web服务,它在类库模块中调用GenerateBook方法,该模块生成100页的XPS文件。以下代码部分工作正常。但我希望使用并行编程更快。所以我用下面的代码转换了代码,但我发现四核(4 CPU)机器的性能没有影响。 STA线程不能并行运行或我做错了吗?

 for (int pageNumber = from; pageNumber <= to; pageNumber++)
            {
                var pageVisual = paginator.GetPage(pageNumber - 1);
                var page = new PageContent();

                var fixedPage = new FixedPage();

                fixedPage.Width = fixedDoc.DocumentPaginator.PageSize.Width;
                fixedPage.Height = fixedDoc.DocumentPaginator.PageSize.Height;

                fixedPage.Children.Add(pageVisual);

                ((IAddChild)page).AddChild(fixedPage);
                fixedDoc.Pages.Add(page);
            }
           ...
并行编程后的

TaskScheduler taskUI = TaskScheduler.FromCurrentSynchronizationContext();

            List<Task> tasks = new List<Task>();
            for (int pageNumber = from; pageNumber <= to; pageNumber++)
            {

                int pageCounter = pageNumber;
                var t = Task.Factory.StartNew(() =>
                {
                    var pageVisual = paginator.GetPage(pageCounter - 1);
                    var page = new PageContent();

                    var fixedPage = new FixedPage();

                    fixedPage.Width = fixedDoc.DocumentPaginator.PageSize.Width;
                    fixedPage.Height = fixedDoc.DocumentPaginator.PageSize.Height;

                    fixedPage.Children.Add(pageVisual);

                    ((IAddChild)page).AddChild(fixedPage);
                    fixedDoc.Pages.Add(page);
                }, CancellationToken.None, TaskCreationOptions.None, taskUI);

                tasks.Add(t);

            }

非常感谢任何回应。

0 个答案:

没有答案