.NETヘルプ C# BackgroundWorker(開発者向けの仕組み) Jacob Mellor 更新日:6月 29, 2025 IronPDF をダウンロード NuGet ダウンロード DLL ダウンロード Windows 版 無料トライアル LLM向けのコピー LLM向けのコピー LLM 用の Markdown としてページをコピーする ChatGPTで開く このページについてChatGPTに質問する ジェミニで開く このページについてGeminiに問い合わせる ジェミニで開く このページについてGeminiに問い合わせる 困惑の中で開く このページについてPerplexityに問い合わせる 共有する Facebook で共有 Xでシェア(Twitter) LinkedIn で共有 URLをコピー 記事をメールで送る IronPDFを使用してPDFを生成することは、.NET開発者にとって一般的な作業です。特に動的なレポート、請求書、ドキュメント自動化システムを構築する際です。 しかし、Windows FormsまたはWPFアプリでメインUIスレッドでPDF生成をトリガーしたことがあるなら、ユーザーインターフェースがフリーズしたり、応答しなくなるのを見たことがあるでしょう。特に大きなHTMLコンテンツをレンダリングする場合や複雑なPDFレイアウトを処理する場合は特にそうです。 そこで、C#のBackgroundWorkerクラスが登場します。 この記事では、デスクトップアプリでの非同期操作をUIをロックせずに処理するために、BackgroundWorkerとIronPDFを統合する方法について説明します。 IronPDFでBackgroundWorkerを使用する理由 UIを応答性のある状態に保つ PDF生成のようなCPU集約型またはI/Oに制約されるタスクをメインスレッドで実行すると、UIがロックされます。 ユーザーは操作が進行中の間、クリック、ドラッグ、アプリケーションとのインタラクションができません。 BackgroundWorkerオブジェクトを使用することで、作業を別のスレッドに移動し、バックグラウンド処理中でもインターフェースが迅速で使いやすい状態を維持できます。 レポート生成や長時間実行タスクに最適 アプリがデータのエクスポート、HTMLをPDFに変換、詳細レポートのレンダリングを含む場合、それをバックグラウンドワーカーにオフロードすることで、アプリケーションはよりプロフェッショナルでパフォーマンスが向上します。 レガシーWinFormsアプリとも互換性あり モダンアプリはしばしばasync/awaitを使用しますが、多くの古いプロジェクトはそのシンプルさとVisual Studioでのデザイン時のサポートのためにBackgroundWorkerを利用するメリットがあります。 IronPDFとは何ですか? IronPDFは、C#でPDFドキュメントを生成、編集、操作するために設計された強力な.NETライブラリです。 内部ではヘッドレスChromiumブラウザーを使用し、開発者がHTML、CSS、JavaScript、および複雑なウェブページを正確で印刷品質のPDFに変換できるようにします。 従来のPDF生成ツールとは異なり、IronPDFは文書をブラウザーに表示されるのとまったく同様にレンダリングします—レイアウト、フォント、画像、スタイルをピクセル単位でマッチさせます。 主要機能 HTMLからPDFへの変換 - HTML文字列、URL、またはフルウェブページをPDFにレンダリング。 イメージとテキストのレンダリング - ヘッダー、フッター、透かし、画像をプログラムで追加。 PDFのマージおよび分割 - 複数の文書を結合または特定のページを抽出。 フォームの入力と注釈 - インタラクティブPDFフォームで作業。 外部依存関係なし - Adobe AcrobatまたはMicrosoft Officeのインストールを必要とせずに動作。 IronPDFは.NET Framework、.NET Core、.NET 6/7+をサポートしており、デスクトップおよびウェブベースの.NETアプリケーションに理想的です。 NuGet経由でのIronPDFのインストール 始めるには、NuGetパッケージマネージャーを使用してプロジェクトにIronPDFをインストールしてください: Install-Package IronPdf これにより、必要なすべての参照が追加され、IronPDFのChromePdfRenderer、HtmlToPdf、その他の強力な機能を使用することができます。 この例では、Visual Studioで作成されたWindows Formsアプリケーションを使用して、PDF生成をトリガーするボタンと、プロセスが完了したときに表示するラベルがあります。 IronPDFのためのBackgroundWorkerの実装 次に、BackgroundWorkerを構造化して安全な方法で使用する手順を次のコード例を用いて詳しく見ていきます: ステップ1 – BackgroundWorkerを定義する デザイナーまたはコードでBackgroundWorkerを作成および構成できます。 これがコードアプローチです: private void SetupBackgroundWorker() { // new backgroundworker worker instance worker = new BackgroundWorker(); // dowork event handler worker.DoWork += PdfWorker_DoWork; worker.RunWorkerCompleted += PdfWorker_RunWorkerCompleted; // final result handler } private void SetupBackgroundWorker() { // new backgroundworker worker instance worker = new BackgroundWorker(); // dowork event handler worker.DoWork += PdfWorker_DoWork; worker.RunWorkerCompleted += PdfWorker_RunWorkerCompleted; // final result handler } Private Sub SetupBackgroundWorker() ' new backgroundworker worker instance worker = New BackgroundWorker() ' dowork event handler worker.DoWork += PdfWorker_DoWork worker.RunWorkerCompleted += PdfWorker_RunWorkerCompleted ' final result handler End Sub $vbLabelText $csharpLabel これにより、ワーカが初期化され、バックグラウンド実行と完了のために必要なイベントが接続されます。 ステップ2 – DoWorkイベントを処理する DoWorkメソッドは異なるスレッドで実行され、バックグラウンド操作(PDFの生成)を実行します: private void PdfWorker_DoWork(object sender, DoWorkEventArgs e) { var Renderer = new ChromePdfRenderer(); // Simulate input from UI or parameters string htmlContent = "<h1>Monthly Report</h1><p>Generated with IronPDF.</p>"; string outputPath = Path.Combine(Environment.CurrentDirectory, "Report.pdf"); // Generate PDF var pdf = Renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs(outputPath); // Optionally pass result info e.Result = outputPath; // pass value to RunWorkerCompleted } private void PdfWorker_DoWork(object sender, DoWorkEventArgs e) { var Renderer = new ChromePdfRenderer(); // Simulate input from UI or parameters string htmlContent = "<h1>Monthly Report</h1><p>Generated with IronPDF.</p>"; string outputPath = Path.Combine(Environment.CurrentDirectory, "Report.pdf"); // Generate PDF var pdf = Renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs(outputPath); // Optionally pass result info e.Result = outputPath; // pass value to RunWorkerCompleted } Private Sub PdfWorker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Dim Renderer = New ChromePdfRenderer() ' Simulate input from UI or parameters Dim htmlContent As String = "<h1>Monthly Report</h1><p>Generated with IronPDF.</p>" Dim outputPath As String = Path.Combine(Environment.CurrentDirectory, "Report.pdf") ' Generate PDF Dim pdf = Renderer.RenderHtmlAsPdf(htmlContent) pdf.SaveAs(outputPath) ' Optionally pass result info e.Result = outputPath ' pass value to RunWorkerCompleted End Sub $vbLabelText $csharpLabel 注意: ここではワーカースレッドで実行されるため、UIコントロールと対話することはできません。 ステップ3 – RunWorkerCompletedで完了を通知する バックグラウンドスレッドが完了すると、結果を使用して安全にUIを更新できます。 private void PdfWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) { MessageBox.Show("Error: " + e.Error.Message); } else { string savedPath = e.Result.ToString(); MessageBox.Show("PDF created at:\n" + savedPath); } } private void PdfWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) { MessageBox.Show("Error: " + e.Error.Message); } else { string savedPath = e.Result.ToString(); MessageBox.Show("PDF created at:\n" + savedPath); } } Imports Microsoft.VisualBasic Private Sub PdfWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) If e.Error IsNot Nothing Then MessageBox.Show("Error: " & e.Error.Message) Else Dim savedPath As String = e.Result.ToString() MessageBox.Show("PDF created at:" & vbLf & savedPath) End If End Sub $vbLabelText $csharpLabel ステップ4 – UIからBackgroundWorkerをトリガーする クリック時にバックグラウンドタスクを実行する開始ボタンを追加します: private void btnGeneratePDF_Click(object sender, EventArgs e) { if (pdfWorker == null) SetupBackgroundWorker(); if (!pdfWorker.IsBusy) { btnGeneratePDF.Enabled = false; pdfWorker.RunWorkerAsync(); // execute method in background } } private void btnGeneratePDF_Click(object sender, EventArgs e) { if (pdfWorker == null) SetupBackgroundWorker(); if (!pdfWorker.IsBusy) { btnGeneratePDF.Enabled = false; pdfWorker.RunWorkerAsync(); // execute method in background } } Private Sub btnGeneratePDF_Click(ByVal sender As Object, ByVal e As EventArgs) If pdfWorker Is Nothing Then SetupBackgroundWorker() End If If Not pdfWorker.IsBusy Then btnGeneratePDF.Enabled = False pdfWorker.RunWorkerAsync() ' execute method in background End If End Sub $vbLabelText $csharpLabel フルコード例 これが単一の動作するWindows Formsスニペットとしてすべてを結びつけたものです: using System; using System.ComponentModel; using IronPdf; using System.IO; using System.Windows.Forms; namespace TestApp { public partial class Form1 : Form { private BackgroundWorker worker; public Form1() { InitializeComponent(); SetupBackgroundWorker(); } private void SetupBackgroundWorker() { worker = new BackgroundWorker(); worker.DoWork += PdfWorker_DoWork; worker.RunWorkerCompleted += PdfWorker_RunWorkerCompleted; } private void btnGeneratePDF_Click(object sender, EventArgs e) { if (!worker.IsBusy) { btnGeneratePDF.Enabled = false; worker.RunWorkerAsync(); } } private void PdfWorker_DoWork(object sender, DoWorkEventArgs e) { var Renderer = new ChromePdfRenderer(); string htmlContent = "<h1>Report</h1><p>This PDF was generated in the background.</p>"; string outputPath = Path.Combine(Environment.CurrentDirectory, "Report.pdf"); var pdf = Renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs(outputPath); e.Result = outputPath; } private void PdfWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { btnGeneratePDF.Enabled = true; if (e.Error != null) { MessageBox.Show("Failed: " + e.Error.Message); } else { MessageBox.Show("PDF created: " + e.Result.ToString()); } } private void btnGeneratePDF_Click_1(object sender, EventArgs e) { if (!worker.IsBusy) { btnGeneratePDF.Enabled = false; worker.RunWorkerAsync(); } } } } using System; using System.ComponentModel; using IronPdf; using System.IO; using System.Windows.Forms; namespace TestApp { public partial class Form1 : Form { private BackgroundWorker worker; public Form1() { InitializeComponent(); SetupBackgroundWorker(); } private void SetupBackgroundWorker() { worker = new BackgroundWorker(); worker.DoWork += PdfWorker_DoWork; worker.RunWorkerCompleted += PdfWorker_RunWorkerCompleted; } private void btnGeneratePDF_Click(object sender, EventArgs e) { if (!worker.IsBusy) { btnGeneratePDF.Enabled = false; worker.RunWorkerAsync(); } } private void PdfWorker_DoWork(object sender, DoWorkEventArgs e) { var Renderer = new ChromePdfRenderer(); string htmlContent = "<h1>Report</h1><p>This PDF was generated in the background.</p>"; string outputPath = Path.Combine(Environment.CurrentDirectory, "Report.pdf"); var pdf = Renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs(outputPath); e.Result = outputPath; } private void PdfWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { btnGeneratePDF.Enabled = true; if (e.Error != null) { MessageBox.Show("Failed: " + e.Error.Message); } else { MessageBox.Show("PDF created: " + e.Result.ToString()); } } private void btnGeneratePDF_Click_1(object sender, EventArgs e) { if (!worker.IsBusy) { btnGeneratePDF.Enabled = false; worker.RunWorkerAsync(); } } } } Imports System Imports System.ComponentModel Imports IronPdf Imports System.IO Imports System.Windows.Forms Namespace TestApp Partial Public Class Form1 Inherits Form Private worker As BackgroundWorker Public Sub New() InitializeComponent() SetupBackgroundWorker() End Sub Private Sub SetupBackgroundWorker() worker = New BackgroundWorker() AddHandler worker.DoWork, AddressOf PdfWorker_DoWork AddHandler worker.RunWorkerCompleted, AddressOf PdfWorker_RunWorkerCompleted End Sub Private Sub btnGeneratePDF_Click(ByVal sender As Object, ByVal e As EventArgs) If Not worker.IsBusy Then btnGeneratePDF.Enabled = False worker.RunWorkerAsync() End If End Sub Private Sub PdfWorker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Dim Renderer = New ChromePdfRenderer() Dim htmlContent As String = "<h1>Report</h1><p>This PDF was generated in the background.</p>" Dim outputPath As String = Path.Combine(Environment.CurrentDirectory, "Report.pdf") Dim pdf = Renderer.RenderHtmlAsPdf(htmlContent) pdf.SaveAs(outputPath) e.Result = outputPath End Sub Private Sub PdfWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) btnGeneratePDF.Enabled = True If e.Error IsNot Nothing Then MessageBox.Show("Failed: " & e.Error.Message) Else MessageBox.Show("PDF created: " & e.Result.ToString()) End If End Sub Private Sub btnGeneratePDF_Click_1(ByVal sender As Object, ByVal e As EventArgs) If Not worker.IsBusy Then btnGeneratePDF.Enabled = False worker.RunWorkerAsync() End If End Sub End Class End Namespace $vbLabelText $csharpLabel フォーム出力 PDF出力 ベストプラクティス DoWorkでのUIアクセスを避ける DoWorkイベントハンドラーは異なるスレッドで実行されるため、直接UI要素にアクセスすることはできません。 RunWorkerCompletedまたはコントロールのInvoke()を使い、安全にUIを更新してください。 非同期キャンセレーションのサポート タスクが長引く場合は、WorkerSupportsCancellation = trueを有効にし、DoWork内でCancellationPendingを監視してリクエストされたキャンセルをサポートします。 進捗の報告を使用する(オプション) WorkerReportsProgress = trueを有効にし、ProgressChangedイベントを使用してプログレスバーまたはメッセージを表示できます。 入力引数の検証 RunWorkerAsync(argument)を使用する場合、引数をDoWorkで検証し、メソッドの結果をe.Resultで返します。 結論 BackgroundWorkerとIronPDFを使用することで、バックグラウンドスレッドで大規模なPDFレンダリングタスクを実行し、アプリケーションをレスポンシブに保つことができます。これは特に、PDF生成のような長時間実行されるタスクの間にレスポンシブなUIアップデートを必要とするWinFormsまたはWPFアプリで価値があります。 doworkイベントハンドラーを処理し、最終結果を監視し、runworkercompletedイベントでユーザーインターフェースを安全に更新することで、バックグラウンド操作をスムーズに実行することができます。 新しいアプリケーションのためのgo-toはしばしばasync/awaitですが、BackgroundWorkerはレガシーまたはWinFormsプロジェクトにとって信頼性の高いツールです。 レポートをエクスポートする場合でも、オフハンドでドキュメントを生成する場合でも、このアプローチは、アプリをスムーズでユーザーフレンドリーに保ちながら、IronPDFを最大限に活用するのに役立ちます。 準備はできましたか? 無料のIronPDFトライアルをダウンロードして、今日からC#で強力なPDFソリューションの構築を始めましょう。 トライアルでは、この記事で紹介された機能に完全にアクセスでき、クレジットカードの必要はありません。 よくある質問 C# Windows FormsアプリケーションでUIをフリーズさせずにPDF生成を行うにはどうすればよいですか? C# BackgroundWorkerクラスをIronPDFと組み合わせて使用し、別のスレッドでPDF生成を行うことができます。これにより、プロセス中にメインUIスレッドがレスポンシブに保たれます。 BackgroundWorkerのDoWorkイベントハンドラーの役割は何ですか? DoWorkイベントハンドラーは、IronPDFを使用したPDF生成のような長時間のタスクを実行する場所です。UIとは別のスレッドで実行されるため、インターフェースがフリーズするのを防ぎます。 背景のPDF生成タスクの結果でUIを更新するにはどうすればよいですか? RunWorkerCompletedイベントを使用して、PDF生成の結果でUIを更新します。このイベントはバックグラウンドタスクが完了したときにトリガーされ、UI要素との安全なインタラクションを可能にします。 古い.NETアプリケーションでのPDF処理にBackgroundWorkerを使用する利点は何ですか? BackgroundWorkerは、レガシーなWinFormsアプリケーションで非同期操作を実装するための簡単な方法を提供し、IronPDFでのPDF処理のようなタスクを扱うシンプルなモデルを提供しながら、UIをレスポンシブに保ちます。 BackgroundWorkerを使用してPDF生成タスクをキャンセルできますか? はい、BackgroundWorkerはタスクのキャンセルをサポートしています。DoWorkイベントハンドラーでCancellationPendingプロパティを確認し、タスクを円滑に終了させることでキャンセルを実装できます。 BackgroundWorkerを使用してPDF生成の進行状況を追跡するにはどうすればよいですか? BackgroundWorkerのReportProgressメソッドを使用して、DoWorkメソッドから進行状況を報告できます。これにより、PDF生成中にUIに進行状況情報を更新できます。 なぜDoWorkイベントハンドラーでUIの更新を避けるべきなのですか? DoWorkイベントハンドラーでのUIの更新は避けるべきです。それが別のスレッドで実行されるからです。直接のUI操作はスレッド問題を引き起こす可能性があります。代わりに、UIの更新にはRunWorkerCompletedまたはProgressChangedイベントを使用してください。 C#でPDF生成のためのBackgroundWorkerの設定にはどのような手順が含まれていますか? BackgroundWorkerの設定には、ワーカーの初期化、DoWorkおよびRunWorkerCompletedイベントの処理、RunWorkerAsyncを使用したタスクの開始が含まれています。この設定は、IronPDFを使ったPDF生成のようなタスクを実行するために使用されます。 非同期/待機パターンを使用して.NETアプリケーションでPDF生成を行うことは必要ですか? 最新の非同期/待機パターンは新しいアプリケーションに推奨されますが、古いWinFormsアプリケーションでは、BackgroundWorkerがPDF生成のような非同期タスクを処理するためにそのシンプルさと使いやすさから有用なままです。 Jacob Mellor 今すぐエンジニアリングチームとチャット 最高技術責任者(CTO) Jacob Mellorは、Iron Softwareの最高技術責任者であり、C# PDF技術の開拓者としてその先進的な役割を担っています。Iron Softwareのコアコードベースのオリジナルデベロッパーである彼は、創業時から製品のアーキテクチャを形作り、CEOのCameron Rimingtonと協力してNASA、Tesla、全世界の政府機関を含む50人以上の会社に成長させました。Jacobは、1998年から2001年にかけてマンチェスター大学で土木工学の第一級優等学士号(BEng)を取得しました。1999年にロンドンで最初のソフトウェアビジネスを立ち上げ、2005年には最初の.NETコンポーネントを作成し、Microsoftエコシステムにおける複雑な問題の解決を専門にしました。彼の旗艦製品であるIronPDFとIronSuite .NETライブラリは、全世界で3000万以上のNuGetインストールを達成しており、彼の基本コードが世界中で使用されている開発者ツールを支えています。商業的な経験を25年間積み、コードを書くことを41年間続けるJacobは、企業向けのC#、Java、およびPython PDF技術の革新を推進し続け、次世代の技術リーダーを指導しています。 関連する記事 更新日 12月 11, 2025 CLIの簡素化と.NETの橋渡し:Curl DotNetとIronPDFを使う Jacob Mellorは、.NETエコシステムにcURLの親しみやすさをもたらすために作成されたライブラリ、CurlDotNetでこのギャップを埋めました。 詳しく読む 更新日 9月 4, 2025 RandomNumberGenerator C# RandomNumberGenerator C#クラスを使用すると、PDF生成および編集プロジェクトを次のレベルに引き上げることができます 詳しく読む 更新日 9月 4, 2025 C# String Equals(開発者向けの仕組み) 強力なPDFライブラリであるIronPDFと組み合わせることで、switchパターンマッチングは、ドキュメント処理のためのよりスマートでクリーンなロジックを構築できます 詳しく読む C# Event Handler(開発者向けの仕組み)FieldとProperty C#(開発者向...
更新日 12月 11, 2025 CLIの簡素化と.NETの橋渡し:Curl DotNetとIronPDFを使う Jacob Mellorは、.NETエコシステムにcURLの親しみやすさをもたらすために作成されたライブラリ、CurlDotNetでこのギャップを埋めました。 詳しく読む
更新日 9月 4, 2025 RandomNumberGenerator C# RandomNumberGenerator C#クラスを使用すると、PDF生成および編集プロジェクトを次のレベルに引き上げることができます 詳しく読む
更新日 9月 4, 2025 C# String Equals(開発者向けの仕組み) 強力なPDFライブラリであるIronPDFと組み合わせることで、switchパターンマッチングは、ドキュメント処理のためのよりスマートでクリーンなロジックを構築できます 詳しく読む