.NET ヘルプ

C#の揮発性(開発者のための仕組み)

イントロダクション

C#のvolatileキーワードは、フィールドが同時に実行されているスレッドによって更新される可能性があることを示すために使用されます。 volatile としてタグ付けされたフィールドは、コンパイラとランタイムに対し、同時実行中のスレッドや他のプログラムコンポーネントが警告なしにフィールドの値を変更する可能性があることを通知します。 これにより、そのフィールドへのメモリアクセスがコンパイラによって最適化されないことが保証されます。これにより、[マルチスレッドアプリケーション](https://en.wikipedia.org/wiki/Multithreading_(computer_architecture)で予期しない動作が引き起こされる可能性があります

人気のあるC#ライブラリで、PDFドキュメントの作成と修正を行うのがIronPDF - .NET PDF Libraryです。 マルチスレッドアプリケーションやIronPDFを使用したPDFの作成または操作を行うプログラムで、volatileキーワードを適切に利用する方法を知ることは重要です。 これにより、複数のスレッドがデータにアクセスする際に、データが適切に同期され、一貫性が保たれるようになります。

このチュートリアルでは、IronPDFとvolatileキーワードを使用して、PDFを生成または操作する信頼性の高いマルチスレッドアプリを作成するための最良の方法をカバーします。 揮発性フィールドの一般的な使用方法、揮発性フィールドを正しく宣言して使用する方法、IronPDFを使用したアプリケーションをスレッドセーフにするための推奨事項について説明します。 それでは始めましょう!

C&numの使い方;揮発性

  1. 必要なライブラリをインポートする。

  2. 揮発性変数の宣言

  3. PDF生成タスクの開始。

  4. タスクに揮発性変数を設定

  5. 揮発性変数のチェック。

  6. PDF生成を待つ。

  7. PDFの完成を扱う。

C#Volatileとは?

複数のスレッドによって同時に変更される可能性のあるフィールドを宣言する際には、volatile キーワードを使用します。 フィールドがvolatileに指定されると、同時実行スレッドを含む他のプログラム・コンポーネントが警告なしにその値を変更する可能性があることが、コンパイラとランタイムに警告される。このため、揮発性フィールドへの読み書きは、常に最初に同じメモリに対して直接行われる。

volatile キーワードは、メモリ障壁を強制することにより、メモリ操作の再順序化に関連する問題に対処します。 メモリバリアは、揮発性アクセスにまたがってメモリ操作が並び替えられないようにし、マルチスレッドシナリオでの予期せぬ動作を防ぐ。

メモリバリアを暗黙的に、揮発性読み取りの前後または揮発性書き込み操作中に使用することにより、volatileはメモリ操作の正しい順序を保証し、揮発性でないオブジェクトを使用した場合に発生したかもしれない問題と対照的に、並行環境でのスレッドセーフティとデータの一貫性を向上させます。

揮発性キーワードの目的

C#におけるvolatileキーワードは、主に複数のスレッドが不適切に同期して共有データのメモリ位置にアクセスおよび変更する状況を処理するために使用されます。 マルチスレッド環境では、volatile修飾子が存在しないと、コンパイラがメモリ・アクセスを最適化し、予測できない動作を引き起こす可能性がある。

開発者は、フィールドをvolatileと指定することで、フィールドの値が非同期的に変化する可能性があること、データの整合性を保つためには直接メモリにアクセスする必要があることをコンパイラに示すことができる。

揮発性キーワードの挙動

コンパイラとランタイムは、volatileとマークされたフィールドに対するすべての読み書きのメモリ操作が、可能な限りのキャッシュメソッドを使わないようにする。 これは、揮発性フィールドの値は、一度キャッシュされた同じ値に依存するのではなく、たとえスレッドがキャッシュしたとしても、その後のアクセス時には常にメインメモリからフェッチされることを示す。 同様に、揮発性フィールドへの書き込みは即座にメモリに伝搬されるため、あるスレッドが行った変更は、同じフィールドにアクセスする他のすべてのスレッドに見える。

共有状態に揮発性を使う

いくつかのコードサンプルを使用して、volatile キーワードの使用方法を示しましょう。

using System;
using System.Threading;
class SharedStateExample
{
    private volatile bool _isRunning = true;
    public void Run()
    {
        Thread thread1 = new Thread(ChangeState);
        Thread thread2 = new Thread(ReadState);
        thread1.Start();
        thread2.Start();
    }
    private void ChangeState()
    {
        while (_isRunning)
        {
            Console.WriteLine("Changing state...");
            Thread.Sleep(1000);
            _isRunning = false;
        }
    }
    private void ReadState()
    {
        while (_isRunning)
        {
            Console.WriteLine("Reading state...");
            Thread.Sleep(500);
        }
        Console.WriteLine("State is no longer running.");
    }
}
class Program
{
    static void Main(string[] args)
    {
        SharedStateExample example = new SharedStateExample();
        example.Run();
    }
}
using System;
using System.Threading;
class SharedStateExample
{
    private volatile bool _isRunning = true;
    public void Run()
    {
        Thread thread1 = new Thread(ChangeState);
        Thread thread2 = new Thread(ReadState);
        thread1.Start();
        thread2.Start();
    }
    private void ChangeState()
    {
        while (_isRunning)
        {
            Console.WriteLine("Changing state...");
            Thread.Sleep(1000);
            _isRunning = false;
        }
    }
    private void ReadState()
    {
        while (_isRunning)
        {
            Console.WriteLine("Reading state...");
            Thread.Sleep(500);
        }
        Console.WriteLine("State is no longer running.");
    }
}
class Program
{
    static void Main(string[] args)
    {
        SharedStateExample example = new SharedStateExample();
        example.Run();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

この例のSharedStateExampleクラスには、ボラタイルオブジェクトとしてフラグ付けされたisRunningフィールドがあります。 ChangeState メソッドは状態を変更するために作成され、ReadState メソッドは一時的な読み取り操作状態を確立します。

ReadState メソッドが isRunning の値を継続的にチェックする間、ChangeState メソッドは遅延してから isRunning を false に設定します。 isRunning の揮発性により、1つのスレッドによって行われた変更は、他のスレッドにも即座に反映されます。

揮発性によるダブルチェック・ロック

using System;
class Singleton
{
    private static volatile Singleton _instance;
    private static readonly object _lock = new object();
    private Singleton() { }
    public static Singleton GetInstance()
    {
        if (_instance == null)
        {
            lock (_lock)
            {
                if (_instance == null)
                {
                    _instance = new Singleton();
                }
            }
        }
        return _instance;
    }
}
class Program
{
    static void Main(string[] args)
    {
        Singleton instance1 = Singleton.GetInstance();
        Singleton instance2 = Singleton.GetInstance();
        Console.WriteLine("Are instances equal? " + (instance1 == instance2));
    }
}
using System;
class Singleton
{
    private static volatile Singleton _instance;
    private static readonly object _lock = new object();
    private Singleton() { }
    public static Singleton GetInstance()
    {
        if (_instance == null)
        {
            lock (_lock)
            {
                if (_instance == null)
                {
                    _instance = new Singleton();
                }
            }
        }
        return _instance;
    }
}
class Program
{
    static void Main(string[] args)
    {
        Singleton instance1 = Singleton.GetInstance();
        Singleton instance2 = Singleton.GetInstance();
        Console.WriteLine("Are instances equal? " + (instance1 == instance2));
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

この例では、スレッドセーフなシングルトン設計を構築するために、ダブルチェックのロック機構を使用する。 複数のスレッド間で行われた変更が最新で可視であることを保証するために、_instanceフィールドはvolatileとして指定されています。これにより、単一のスレッドが初期化が半分しか完了していないSingletonインスタンスに気付く状況を避けます。 マルチスレッドコンテキストであっても、ダブルチェックされたロックメカニズムにより、シングルトンのインスタンスは1つしか生成されないことが保証される。

IronPDFとは何ですか?

C#ライブラリIronPDF - PDF Generation and Editingは、プログラマーが.NETアプリケーション内でPDFドキュメントを作成、変更、およびレンダリングすることを可能にします。 その豊富な機能セットにより、PDFファイルを簡単に扱うことができます。 すでに存在するPDF文書を編集、分割、結合することができます。 PDF文書は、HTML、画像、その他の形式で作成することができます。 PDFには、テキスト、写真、その他のデータを注釈することができます。

IronPDFの機能

テキストと画像アノテーション

IronPDFを使えば、プログラムでPDFドキュメントにテキストや画像、その他のデータを注釈することができます。 このツールを使って、PDFファイルに署名、スタンプ、コメントなどの注釈を付けることができます。

PDFセキュリティ

IronPDFは文書の印刷、コピー、編集を含む様々な権限を指定することができ、PDF文書をパスワードで暗号化することができます。 これにより、PDFファイルへのアクセス権を管理し、機密情報を保護することができます。

インタラクティブPDFフォームの入力

IronPDFを使えば、インタラクティブなPDFフォームにプログラムで入力することができます。 この機能は、ユーザー入力に基づいてパーソナライズされたドキュメントを作成したり、フォーム送信を自動化したりするのに役立ちます。

PDFの圧縮と最適化

IronPDFは品質を犠牲にすることなくサイズを最小化するPDFファイルの最適化と圧縮の選択肢を提供します。 その結果、PDF文書はより少ないストレージスペースで、より効率的に動作する。

クロスプラットフォーム互換性

IronPDFはWindows、Linux、macOSを含む様々なオペレーティングシステム上の.NETプログラムで完璧に機能するように設計されています。 ASP.NET、.NET Core、Xamarinなどのよく知られた.NETフレームワークが統合されています。

新しいVisual Studioプロジェクトを作成する

Visual Studioでコンソール・プロジェクトを作成するのは簡単です。 コンソール・アプリケーションを起動するには、Visual Studio環境内で以下の簡単な手順に従ってください:

Visual Studioを使用する前に、コンピューターにインストールされていることを確認してください。

新しいプロジェクトを開始

ファイルを選択し、「新規」を選び、最後に「プロジェクト」を選択します。

C# ボラタイル(開発者向けの動作原理):図 1

「新しいプロジェクトを作成」ボックスで、左のリストから希望するプログラミング言語(例えばC#)を選択します。

次のプロジェクトテンプレート参照リストには、「Console App」または「Console App (.NET Core)」テンプレートが選択可能です。

「名前」フィールドにプロジェクト名を入力してください。

C# Volatile(開発者にとっての動作方法):図2

プロジェクトが保存される場所を選択します。

Create "をクリックすると、コンソールアプリケーションのプロジェクトが開始されます。

C# Volatile(開発者向けの仕組み):図 3

IronPDFのインストール

Visual Studio Tools メニューの Tools には Visual Command-Line インターフェイスがあります。 NuGet パッケージ マネージャーを選択します。 パッケージ管理ターミナルタブで、以下のコマンドを入力する。

Install-Package IronPdf
Install-Package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package IronPdf
$vbLabelText   $csharpLabel

または、パッケージマネージャを使うこともできます。 パッケージをソリューションに直接インストールするには、NuGet Package Managerオプションを使用します。 NuGet Manager ウェブサイトの検索ボックスを使用してパッケージを見つけてください。 以下のサンプルスクリーンショットは、パッケージマネージャで "IronPDF "を検索するのがいかに簡単かを示しています:

C# Volatile(開発者向けの仕組み):図4 - NuGetパッケージマネージャーからIronPDFをインストール

該当する検索結果は上の画像に表示されている。 お使いのマシンにソフトウェアがより簡単にインストールできるように、以下の変更を行ってください。

パッケージをダウンロードしてインストールしたら、現在進行中のプロジェクトで使うことができる。

C# VolatileとIronPDFによるPDF生成のスレッド安全性の確保

それでは、C#プログラムでIronPDFとvolatileキーワードを一緒に使用してみましょう。 PDFドキュメントを作成・修正するためのよく知られたC#ライブラリーにIronPDFというものがある。 IronPDFをPDFの作成や処理に使用するマルチスレッドアプリケーションで作業する際には、スレッドセーフを維持する必要があります。

マルチスレッド環境でPDFドキュメントを作成するためにIronPDFのvolatileキーワードを利用する例を示します。

using IronPdf;
using System;
using System.Threading;
class PdfGenerator
{
    private volatile bool _isRunning = true;
    private readonly object _lock = new object();
    public void GeneratePdf(string filePath)
    {
        Thread thread = new Thread(() =>
        {
            while (_isRunning)
            {
                // Generate PDF document
                GenerateDocument(filePath);
                // Sleep for some time
                Thread.Sleep(5000);
            }
        });
        thread.Start();
    }
    public void StopPdfGeneration()
    {
        lock (_lock)
        {
            _isRunning = false;
        }
    }
    private void GenerateDocument(string filePath)
    {
        // Load HTML content
        string htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";
        // Convert HTML to PDF
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(content);
        // Save PDF to file
        pdfDocument.SaveAs(filePath);
        // Output status
        Console.WriteLine($"PDF generated and saved to {filePath}");
    }
}
class Program
{
    static void Main(string[] args)
    {
        PdfGenerator pdfGenerator = new PdfGenerator();
        // Start PDF generation
        pdfGenerator.GeneratePdf("output.pdf");
        // Wait for user input to stop PDF generation
        Console.WriteLine("Press any key to stop PDF generation...");
        Console.ReadKey();
        // Stop PDF generation
        pdfGenerator.StopPdfGeneration();
    }
}
using IronPdf;
using System;
using System.Threading;
class PdfGenerator
{
    private volatile bool _isRunning = true;
    private readonly object _lock = new object();
    public void GeneratePdf(string filePath)
    {
        Thread thread = new Thread(() =>
        {
            while (_isRunning)
            {
                // Generate PDF document
                GenerateDocument(filePath);
                // Sleep for some time
                Thread.Sleep(5000);
            }
        });
        thread.Start();
    }
    public void StopPdfGeneration()
    {
        lock (_lock)
        {
            _isRunning = false;
        }
    }
    private void GenerateDocument(string filePath)
    {
        // Load HTML content
        string htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";
        // Convert HTML to PDF
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(content);
        // Save PDF to file
        pdfDocument.SaveAs(filePath);
        // Output status
        Console.WriteLine($"PDF generated and saved to {filePath}");
    }
}
class Program
{
    static void Main(string[] args)
    {
        PdfGenerator pdfGenerator = new PdfGenerator();
        // Start PDF generation
        pdfGenerator.GeneratePdf("output.pdf");
        // Wait for user input to stop PDF generation
        Console.WriteLine("Press any key to stop PDF generation...");
        Console.ReadKey();
        // Stop PDF generation
        pdfGenerator.StopPdfGeneration();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

volatile bool isRunning: 複数のスレッドが変更を加える可能性があることを示すために、isRunning フィールドを volatile 変数として指定します。 PDF文書の生成はこのフィールドによって管理される。 isRunningがtrueの場合、PDF作成は継続される; そうでなければ終了する。

GeneratePdf(string filePath): この関数は、新しいスレッドを起動し、スケジュールに基づいてPDFドキュメントを作成します。 メインスレッド内でisRunningフラグを継続的にチェックします。 その場合、IronPDFを使用してPDFドキュメントを作成し、指定されたファイルディレクトリに保存します。

StopPdfGeneration(): この機能はPDFの作成を停止することを可能にします。 スレッドセーフティを維持するために、isRunningフラグを変更する際、lockというプライベートオブジェクトにロックします。

GenerateDocument(string filePath): この関数には、IronPDF を使用して PDF ドキュメントを作成するのに必要なコードが含まれています。 HtmlToPdf のインスタンスが作成され、HTML情報が読み込まれ、PDF文書に変換された後、指定されたファイルディレクトリにPDFが保存されます。

Main(string[] args): PdfGenerator クラスがインスタンス化され、PDFの生成が開始され、ユーザーにはMainメソッドで任意のキーを押してPDFの生成を停止するように促されます。

C# Volatile(開発者のための仕組み):図5

この例では、IronPDFとvolatileキーワードを使用してマルチスレッド環境で信頼性のあるPDFドキュメントを生成する方法を示しています。 私たちは、volatileを利用して、isRunningフラグの変更がスレッド間で即座に見えるようにすることで、PDF作成プロセスを効果的に制御しています。 また、ワーカースレッドの安全性を維持しながら、isRunning フラグにアクセスして変更するためにロックも使用します。

C# Volatile(開発者向けの動作方法):図6

結論

要約すると、volatile キーワードのIronPDFへの組み込みは、マルチスレッドのC#プログラムでPDFを作成する際のスレッドセーフを保証する強力な方法を提供します。 私たちは、共有コントロールフラグを揮発性として指定することで、スレッド間での変更のタイムリーな認識と適切な同期を保証し、PDF作成プロセスに対する効果的なコントロールを提供します。

制御フラグへの変更がすべてのスレッドに即座にブロードキャストされることを保証することにより、volatileはコンフリクトを回避し、PDF作成に関わるプロセスの効率的な協調を促進するために使用されます。

アプリケーションは、データ破損や競合状態のリスクを冒すことなく、多数のPDF生成プロセスを効果的に同時に管理することができます。

最終的に、バーコードの操作、PDFの作成、OCRの実行、Excelとの連携を効率的に行うためにIronPDFを含め、Iron Softwareのライブラリの可能性を最大限に引き出すことが簡単にできます。 Iron Softwareは、その多様なスイートのパフォーマンス、互換性、使いやすさを組み合わせて、アプリケーションの機能を強化し、より効果的な開発を提供します。

プロジェクトの特定のニーズに合わせた明確なライセンスオプションがあれば、開発者は安心して最適なモデルを選択できる。 これらの利点により、開発者は効率的かつ透過的にさまざまな課題に取り組むことができる。

チペゴ
ソフトウェアエンジニア
チペゴは優れた傾聴能力を持ち、それが顧客の問題を理解し、賢明な解決策を提供する助けとなっています。彼は情報技術の学士号を取得後、2023年にIron Softwareチームに加わりました。現在、彼はIronPDFとIronOCRの2つの製品に注力していますが、顧客をサポートする新しい方法を見つけるにつれて、他の製品に関する知識も日々成長しています。Iron Softwareでの協力的な生活を楽しんでおり、さまざまな経験を持つチームメンバーが集まり、効果的で革新的な解決策を提供することに貢献しています。チペゴがデスクを離れているときは、良い本を楽しんだり、サッカーをしていることが多いです。
< 以前
C# TryParse(開発者向けの動作方法)
次へ >
C# Task.Run(開発者のためのタスク実行方法)