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);
}
どんな反応でも大歓迎です。