.NET ヘルプ

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

公開済み 2024年8月13日
共有:

イントロダクション

C#のvolatileキーワードは、同時に実行されるスレッドによってフィールドが更新される可能性があることを示すために使用される。 としてタグ付けされたフィールド。揮発性は、並行スレッドや他のプログラム・コンポーネントが警告なしにフィールドの値を変更する可能性があることを、コンパイラとランタイムに警告する。 これにより、そのフィールドへのメモリ・アクセスがコンパイラによって最適化されることがなくなり、以下のような予期せぬ動作を引き起こすことがなくなる。マルチスレッドアプリケーション.

PDF ドキュメントを作成および変更するためのよく知られた C# ライブラリは、次のように呼ばれます。IronPDF - .NET PDFライブラリ. volatile`キーワードの適切な使い方を知ることは、マルチスレッドアプリケーションやPDFの作成や操作にIronPDFを使用するプログラムで作業する際に非常に重要です。 これにより、複数のスレッドがデータにアクセスする際に、データが適切に同期され、一貫性が保たれるようになります。

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

C&numの使い方;揮発性

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

  2. 揮発性変数の宣言

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

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

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

  6. PDF生成を待つ。

  7. PDFの完成を扱う。

C#Volatileとは?

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

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

volatile`は、volatile readまたはvolatile write操作の前後に暗黙的にメモリバリアを採用することで、メモリ操作の正しい順序を保証し、並行環境におけるスレッドの安全性とデータの一貫性を強化する。

揮発性キーワードの目的

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
VB   C#

この例のSharedStateExampleクラスには、揮発性オブジェクトとしてフラグを立てられたisRunningフィールドがある。 ChangeStateメソッドは状態を変更するために構築され、ReadState**メソッドは揮発性の読み取り操作状態を確立する。

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

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

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
VB   C#

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

IronPDFとは何ですか?

C#ライブラリIronPDF - PDF生成と編集は、プログラマーが.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# Volatile(開発者のための仕組み):図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
VB   C#

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

C# 揮発性(開発者向けの仕組み):図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
VB   C#

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

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

StopPdf生成():この機能により、PDFの作成を停止することができます。 isRunningフラグを変更してもスレッドの安全性を維持するために、lock`と呼ばれるプライベートオブジェクトをロックする。

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

メイン(文字列[]引数):PdfGenerator`クラスがインスタンス化され、PDF生成が開始され、ユーザーはMainメソッド内で任意のキーを押すことでPDF生成を停止するよう促されます。

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

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

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

結論

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

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

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

最後に、IronPDFを含めることで、バーコード、PDF作成、OCR、Excelとの連携を効率的に行うことができます。IronSoftwareのライブラリの可能性を最大限に引き出す簡単に。 IronSoftwareは、パフォーマンス、互換性、使いやすさを兼ね備えた多用途な製品群により、アプリケーション機能の強化とより効果的な開発を提供します。

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

< 以前
C# TryParse(開発者向けの動作方法)
次へ >
C# Task.Run(開発者のためのタスク実行方法)