IRONSOFTWAREHOME
開発者向けアップデート

C# Concurrent List (開発者向けの仕組み)

Jacob Mellor、Ironチームの最高技術責任者(CTO)
Jacob Mellor
Updated: 2026年4月21日

もし複数のスレッドが共有リソースへのアクセスを争っていることがあったなら、スレッドセーフな実装がゲームではないことをご存じでしょう。 しかし心配しないでください! C#にはコンカレントコレクションがあります - スレッドの安全性をスタイルと優雅さで確保する強力なスイートのスレッドセーフな汎用コレクションクラスです。

Thread Safety and Concurrent Collections in C#

交通信号がない忙しい都市の交差点を思い描きましょう。 混乱を想像できますか! これは、適切なシステムがない場合に複数のスレッドが同時に共有リソースにアクセスする際に発生する現象と似ています。 幸いなことに、C#ではスレッドの交通信号があります - それがコンカレントコレクションと呼ばれます。 これらは、一度に一つのスレッドがリソースにアクセスできるようにするコレクションクラスです。このスレッドセーフティは、複数のスレッドを扱う際に重要です。

Exploring Concurrent Thread Safe Collections in C#

C#では、名前空間ConcurrentBagなどのさまざまな並行処理コレクションクラスがあります。 これらの無秩序なコレクションクラスは、非コンカレントの対応するクラスのスレッドセーフ版を提供します。 コンカレントコレクションを他と区別するのは、それが無秩序なコンカレントコレクションであるということであり、要素に特定の順序がないことを意味します。 例えば、コンカレントリストでは、要素がどこに挿入されるのか正確にはわかりません。 注目すべきは、スレッドセーフティを確保することであり、順序を維持することではありません。

実生活の例を見てみましょう。 ウェブサイト上でのパスワード提出の投稿を考えてみてください。コンカレントコレクションを使用すると、複数のユーザーが同時にパスワードを提出できます。 各"提出"アクションはスレッドのようであり、コンカレントコレクションは各提出がスレッドセーフで、安全かつ効果的に処理されることを保証します。

ConcurrentDictionary: 実例

では、ConcurrentDictionaryコレクションクラスを実際の例で探ってみましょう。 オンライン書店での推奨機能をイメージしてください。 各ユーザーのクリックが、辞書で表された彼らの個人的な推奨リストに本を追加します。 複数のユーザーが同時に本を閲覧しクリックするため、辞書に同時にアクセスする複数のスレッドがあります。

C#のConcurrentDictionaryは次のように見えるでしょう。

using System.Collections.Concurrent;

ConcurrentDictionary<string, string> recommendedBooks = new ConcurrentDictionary<string, string>();

ユーザーの推奨コレクション全体に本を追加するには、TryAddメソッドを使用できます。

public void Insert(string user, string book)
{
    // Try to add the book to the user's recommendations
    recommendedBooks.TryAdd(user, book);
}

このシナリオでは、ConcurrentDictionaryコレクションクラスが各クリック(または"スレッド")を個別に処理することを保証するので、2人のユーザーの推奨が混在することはありません。スレッドの安全性をすべて処理してくれるので、データレースや他のスレッド関連の並行問題を心配する必要はありません。

スレッドセーフな操作の実装

TryUpdateのようなさまざまなスレッドセーフな操作を提供します。 これらのメソッドは、一度に1つのスレッドのみが操作を実行できることを保証します。したがって、例えば、前述の例でユーザーの推奨から本を削除したい場合、TryRemoveメソッドを使用できます。

public void RemoveAt(string user)
{
    // Attempt to remove the book for the specified user
    string removedBook;
    recommendedBooks.TryRemove(user, out removedBook);
}

removedBook変数に入れようとします。

コンカレントコレクションのコピー

さて、同時コレクションを配列にコピーしたいとしましょう。 並行コレクションはこの正確な目的のためにCopyToメソッドを提供します。

public void CopyTo()
{
    // Create an array to hold the recommended books
    string[] bookArray = new string[recommendedBooks.Count];
    
    // Copy the values of the concurrent dictionary to the array
    recommendedBooks.Values.CopyTo(bookArray, 0);
}

ここで、bookArrayにコピーします。

スレッドセーフコレクション

C#はマルチスレッド環境で共有リソースへの安全なアクセスを保証するスレッドセーフコレクションも提供します。 これらのコレクション、例えばConcurrentStackは、複数のスレッドが同時にコレクションにアクセスし、変更を加えることができ、競合やデータの破損を引き起こさないようなスレッドセーフな実装を提供します。

内部的に同期を処理することで一貫性と完全性を保証し、無秩序なコレクションが十分で、C#アプリケーションでスレッドセーフティが最も重要なシナリオに理想的です。

IronPDFの詳細を学ぶは、HTMLからPDFドキュメントを簡単に生成するための人気のあるC#ライブラリです。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}

最初はコンカレントリストとは直接関係ないように見えますが、IronPDFはコンカレントコレクション操作を補完し、コンカレント処理の結果をキャプチャする報告書やログ、その他のドキュメントを作成する簡単な方法を提供します。

集中的なデータ処理を行うマルチスレッドアプリケーションがあるシナリオを考えてみてください。 スレッドがデータを魔法にかけている間に、結果をキャプチャし、さらなる分析や記録のためにPDFレポートを生成したくなるかもしれません。 ここでIronPDFが役立ちます。

IronPDFを使用するのは、ライブラリをプロジェクトに追加し、その便利なAPIを利用するだけです。 IronPDFをコンカレントコレクション操作と統合する方法の例を次に示します:

using IronPdf;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;

// Create a concurrent dictionary to hold your processed data
ConcurrentDictionary<int, string> processedData = new ConcurrentDictionary<int, string>();

// Define your data list (replace with your actual data source)
List<DataItem> dataList = GetDataList();

// Process your data concurrently and store the results in the dictionary
Parallel.ForEach(dataList, (dataItem) =>
{
    // Process each data item and add the result to the dictionary
    string processedResult = ProcessDataItem(dataItem);
    processedData.TryAdd(dataItem.Id, processedResult);
});

// Generate a PDF report with the processed data
var renderer = new ChromePdfRenderer();
var pdfDocument = renderer.RenderHtmlAsPdf(BuildHtmlReport(processedData));
pdfDocument.SaveAs("C:\\processed_data_report.pdf");

// Method to retrieve the data list (replace with your actual data source logic)
List<DataItem> GetDataList()
{
    List<DataItem> dataList = new List<DataItem>()
    {
        new DataItem { Id = 1, Name = "Item 1" },
        new DataItem { Id = 2, Name = "Item 2" },
        new DataItem { Id = 3, Name = "Item 3" },
        new DataItem { Id = 4, Name = "Item 4" }
    };
    return dataList;
}

// Method to process each data item and return the result (replace with your actual data processing logic)
string ProcessDataItem(DataItem dataItem)
{
    // Simulating data processing with a delay
    Task.Delay(100).Wait();
    return $"Processed: {dataItem.Name}";
}

// Method to build the HTML report using the processed data (replace with your actual reporting logic)
string BuildHtmlReport(ConcurrentDictionary<int, string> processedData)
{
    string html = "<h1>Processed Data Report</h1><ul>";
    foreach (var kvp in processedData)
    {
        html += $"<li>Item {kvp.Key}: {kvp.Value}</li>";
    }
    html += "</ul>";
    return html;
}

// Placeholder class for your data item (replace with your actual data item class)
public class DataItem
{
    public int Id { get; set; }
    public string Name { get; set; }
    // Add other properties as needed
}

ここにコードの出力があります:

C# Concurrent List(開発者向けの動作方法) 図1 - 出力

結論

結論として、C#のコンカレントコレクション、例えばコンカレントリストを理解し、利用することは、マルチスレッドシナリオを効率的に処理し、アプリケーションでスレッドセーフティを確保する能力を大幅に向上させます。 コンカレントコレクションを使用することで、共有リソースを効果的に管理し、スレッド間のデータ競合や衝突を防ぐことができます。

外部ライブラリのIronPDFを統合することで、視覚的に魅力的なPDFレポートやドキュメントの生成を可能にし、コンカレントコレクションの機能をさらに拡張できます。 IronPDFはHTMLからPDFへの変換のためのライブラリの無料トライアルを提供しており、その機能や$999から始まるライセンスオプションを探ることができます。

Jacob Mellor、Ironチームの最高技術責任者(CTO)
最高技術責任者(CTO)

ジェイコブ・メラーはIron Softwareの最高技術責任者(CTO)であり、C# PDFテクノロジーを開拓する先見的なエンジニアです。Iron Softwareのコアコードベースを支えるオリジナル開発者として、彼は創業以来、会社の製品アーキテクチャを形成し、CEOのCameron Rimingtonとともに、会社をNASA、Tesla、および世界的な政府機関にサービスを提供する50人以上の会社に変えました。1999年にロンドンで最初のソフトウェアビジネスを開業し、2005年に最初 for .NETコンポーネントを作成した後、Microsoftのエコシステム全体で複雑な問題を解決することを専門としました。

関連する記事

Key in blue circle

無料の30日間トライアルキーをすぐに入手してください。

Your trial license will be sent to your email address

制限なし。100% ロック解除済み。クレジットカード不要。

OR
bullet_checkedクレジットカードやアカウントの作成は不要です。制限なし。100% ロック解除済み。クレジットカード不要。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried Iron Suite
無料のライブデモを予約する
Booking Badge

世界中の数百万人のエンジニアから信頼されています。

ライセンスはより安く
義務のない相談を受ける
下記のフォームを記入するか、sales@ironsoftware.comにメールしてください。
あなたの詳細は常に守秘されます。
世界中の数百万人のエンジニアから信頼されています。
ライセンスはより安く
あなたの無料30日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。
PDF用C# NuGetライブラリ
NuGetでインストール

バージョン: 2026.9

PM > Install-Package IronPdf
nuget.org/packages/IronPdf/
  1. ソリューションエクスプローラーで参照を右クリックし、NuGetパッケージを管理を選択
  2. ブラウズを選択し、"IronPDF"を検索
  3. パッケージを選択してインストール
C# PDF DLL
DLLをダウンロード

バージョン: 2026.9

またはここからWindowsインストーラーをダウンロードする。

  1. IronPDFを~/Libsなどの場所に解凍し、ソリューションディレクトリ内に配置する
  2. Visual Studioソリューションエクスプローラーで参照を右クリックし、"IronPDF.dll"をブラウズして選択

ライセンスは$999から