複数の PDF ファイルを作成するためにレポート ビューアーを使用するフォームを作成しています。これらの PDF ファイルは 4 つの主要な部分に分かれており、各部分が特定のレポートの作成を担当します。これらのプロセスは、ユーザー数 (現在は 50) まで、最小で 1 つのファイルを作成しています。
プログラムは、4 つのメソッドを順番に使用して既に存在します。ユーザー数が増加している場合にパフォーマンスを向上させるために、これらのメソッドをメール プロセスから 4 つの個別のスレッドに分離したいと考えています。
私は C# を使用してマルチスレッド化するのは初めてですが、これを実現する方法について多くの記事を読みました。唯一わからないのは、どの方法から始めればよいかということです。複数のブログ投稿を読んでいるので、4 つの個別のスレッドを使用するか、スレッド プールを使用するか、複数のバックグラウンド ワーカーを使用するかがわかりません。(または、並列プログラミングが最善の方法である必要がありますか?)。ブログの投稿は、3 つ以上のスレッドがスレッド プールを使用しているかどうかを教えてくれますが、一方、winforms を使用している場合は、backgroundworker を使用しているかどうかを教えてくれます。最適なオプション (およびその理由) はどれですか?
最後に、メインスレッドはすべてのプロセスが終了するのを待ってから続行する必要があります。
誰かが私の問題に対する最善の解決策を教えてもらえますか?
*編集後の追加情報*
言い忘れたこと(あなたのコメントと考えられる解決策をすべて読んだ後)。メソッドは、読み取り専用の 1 つの「IEnumerable」を共有します。メソッドを起動した後 (順番に実行する必要はありません)、メソッドはステータス更新を UI に送信するためのイベントをトリガーします。別のスレッドを使用してイベントをトリガーすることは、不可能ではないにしても難しいと思うので、実行中にステータスの更新を報告するための何らかのコールバック関数が必要です。
疑似コードの例。
main()
{
private List<customclass> lcc = importCustomClass()
export.CreatePDFKind1.create(lcc.First(), exportfolderpath, arg1)
export.CreatePDFKind2.create(lcc, exportfolderpath)
export.CreatePDFKind3.create(lcc.First(), exportfolderpath)
export.CreatePDFKind4.create(customclass2, exportfolderpath)
}
namespace export
{
class CreatePDFKind1
{
create(customclass cc, string folderpath)
{
do something;
reportstatus(listviewItem, status, message)
}
}
class CreatePDFKind2
{
create(IEnumerable<customclass> lcc, string folderpath)
{
foreach (var x in lcc)
{
do something;
reportstatus(listviewItem, status, message)
}
}
}
etc.......
}