1

WPF コントロールを使用して XPS ファイルを生成するコードを書いています。100ページのドキュメントとしましょう。ご存知のように、WPF UI 要素を使用しているため、STA スレッドである必要があります。フロント エンドには、100 ページの XPS ファイルを生成するクラス ライブラリ モジュールの GenerateBook メソッドを呼び出す Web サービスがあります。コードの次のセクションは、まったく問題なく動作しています。しかし、並列プログラミングを使用してより高速にしたいのです。そのため、以下のコードを使用してコードを変換しましたが、クアッド コア (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);

            }

どんな反応でも大歓迎です。

4

0 に答える 0