Параллельное программирование с помощью STA-потока или TaskScheduler.FromCurrentSynchronizationContext () - PullRequest
1 голос
/ 26 января 2012

Я пишу код, который создает файл XPS с использованием элементов управления WPF.Допустим, 100 страниц документа.Как мы знаем, поскольку он использует элементы пользовательского интерфейса WPF, он должен быть потоком STA.Из внешнего интерфейса у меня есть веб-сервис, который вызывает метод 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);

            }

Любой ответ был бы очень признателен.

...