IRONSOFTWAREHOME
開發者更新

C# Volatile(對於開發者的運行原理)

Jacob Mellor,首席技術官 @ Team Iron
Jacob Mellor
Updated: 2026年4月23日

C#中的volatile關鍵字用於表示一個欄位可能會被同時執行的執行緒更新。 被標註為volatile的欄位會提醒編譯器和運行時,並發現協同執行緒和其他程式元件可能無預警地改變該欄位的值。 這保證了對該欄位的記憶體存取不會被編譯器優化掉,這可能會導致[多執行緒應用程式](https://en.wikipedia.org/wiki/Multithreading_(computer_architecture)中出現意外行為。

一個受歡迎的C#程式庫,用於建立和修改PDF文件,叫做IronPDF - .NET PDF Library。 在使用IronPDF進行PDF建立或操作等多執行緒應用程式時,正確使用volatile關鍵字至關重要。 這將有助於確保當多個執行緒存取資料時,資料得以適當同步和一致。

本教程將探討如何使用IronPDF和volatile關鍵字來建立可倚賴的,多執行緒應用程式來生成或操作PDF。 我們將討論volatile欄位的常見用途,如何正確宣告和使用volatile欄位,並推薦一些做法以確保您的IronPDF驅動的應用程式是執行緒安全的。 現在讓我們開始吧!

如何使用C# Volatile

  1. 匯入必要的程式庫。
  2. 宣告Volatile變數。
  3. 開始PDF生成任務。
  4. 在任務中設置Volatile變數。
  5. 檢查Volatile變數。
  6. 等待PDF生成。
  7. 處理PDF完成情況。

什麼是C# Volatile?

宣告一個可能會被多個執行緒同時運行而改變的欄位時使用volatile關鍵字。 一個欄位被標記為volatile時會提醒編譯器和運行時,包括並行執行緒在內的其他程式組件可能無預警地更改其值。因此,對volatile欄位的讀寫總是直接從主存進行。

volatile關鍵字通過實施記憶體障礙來處理與重排序記憶體操作相關的問題。 記憶體障礙確保記憶體操作不會在volatile存取間被重新排序,在多執行緒場景中避免出現意外行為。

通過在volatile讀或在volatile寫操作的前後隱式使用記憶體障礙,volatile確保正確的記憶體操作順序,提升在並行環境中執行緒安全性和資料一致性,相對於使用任何非volatile物件所可能出現的問題而言。

Volatile關鍵字的目的

C#中的volatile關鍵字主要用於處理多個執行緒不正確同步以存取和修改共享資料的記憶體位置的情況。 在多執行緒設置中,如果沒有volatile修飾符,編譯器可能會優化記憶體存取,這可能會導致不可預測的行為。

開發人員可以藉由標記欄位為volatile,來表示對於資料完整性,需要直接的記憶體存取,即欄位的值可能會不由自主地改變。

Volatile關鍵字的行為

編譯器和運行時確保對標記為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();
    }
}

本範例中的SharedStateExample類擁有一個被標註為volatile物件的_isRunning欄位。 一個ChangeState方法用於改變狀態,而ReadState方法則建立了一個volatile讀操作。

ReadState方法持續檢查_isRunning的值,而ChangeState方法延遲然後將_isRunning設置為false。 由於_isRunning的易變性,僅由一個執行緒完成的更改立刻能被其他執行緒看到。

雙重檢查鎖與Volatile

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));
    }
}

在此範例中,我們使用雙重檢查鎖機制構建了一個執行緒安全的單例設計。 為了保證在多執行緒間的修改是最新且可見的,_instance欄位被指定為volatile。這樣就避免了只有單一執行緒能夠注意到半初始化的Singleton實例的情形。 即便是在多執行緒環境中,雙重檢查鎖機制也能確保只產生一個Singleton實例。

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被設計出來與.NET程式無縫運作,適用於包括Windows、Linux和macOS在內的多種作業系統。 與ASP.NET、.NET Core和Xamarin等知名的.NET框架相整合。

建立一個新的Visual Studio專案

在Visual Studio中建立一個主控台專案是個直接的過程。 在Visual Studio環境中,請按照下面這些簡單步驟來啟動一個主控台應用程式:

在使用Visual Studio之前,確保其已經安裝於您的電腦。

開始一個新專案

選擇文件,然後新建,最後專案。

C# Volatile (How It Works For Developers): Figure 1

在"建立新專案"框中,從左側的清單中選擇您偏好的程式語言(例如C#)。

緊接著的專案範本參考清單提供了"Console App" 或 "Console App (.NET Core)" 範本可供選擇。

在"名稱"欄位中為您的專案提供一個名稱。

C# Volatile (How It Works For Developers): Figure 2

選擇專案將被保存的位置。

點擊 "建立" 將啟動主控台應用專案。

C# Volatile (How It Works For Developers): Figure 3

安裝IronPDF

在Visual Studio的Tools選單項目下的工具中包含了Visual Command-Line介面。 選擇NuGet Package Manager。 在套件管理終端標籤上,您必須鍵入以下命令。

PM > Install-Package IronPdf

或者,您可以使用Package Manager。 可以使用NuGet套件管理器選項直接將套件安裝到解決方案中。 使用NuGet Manager網站上的搜尋框來尋找包。 隨後的範例截圖顯示了在包管理器中搜尋"IronPDF"的便利程度:

C# Volatile (How It Works For Developers): Figure 4 - Installing IronPDF from the NuGet package manager

上述圖片顯示了相關搜尋結果。 請對以下更改,以便於在您的機器上更容易安裝該軟體。

下載並安裝插件後,我們現在可以在正在進行的專案中使用它。

透過C# Volatile和IronPDF確保PDF生成的執行緒安全性

現在讓我們將IronPDF和volatile關鍵字在C#程式中結合使用。 一個受歡迎的C#程式庫,用於建立和修改PDF文件,叫做IronPDF。 在使用IronPDF進行PDF建立或處理的多執行緒應用中,必須保持執行緒的安全性。

這是一個範例,向您展示如何利用IronPDF的volatile關鍵字在多執行緒環境中生成PDF文件。

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(htmlContent);
        // 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();
    }
}

volatile bool isRunning: 我們指定_isRunning欄位為volatile變數,以表示多個執行緒可能對其進行更改。 PDF文件生成由此欄位管理。 若_isRunning為真,則持續進行PDF建立; 否則,則停止。

GeneratePdf(string filePath): 此功能啟動一個計畫性建立PDF文件的新執行緒。 我們在主執行緒內不斷檢查_isRunning標誌。 如果是這樣,我們使用IronPDF建立一個PDF文件,並將其保存到指定的文件目錄。

StopPdfGeneration(): 此功能使得能夠停止建立PDF。 為了在更改_lock的私有物件上。

GenerateDocument(string filePath): 此功能包含了使用IronPDF建立PDF文件所需的程式碼。 建立一個ChromePdfRenderer實例,載入HTML內容,將其轉換為PDF文件,並將PDF保存到指定的文件目錄。

Main(string[] args): 實例化PdfGenerator類,開始PDF生成,並在Main方法中提示使用者按任何鍵停止PDF生成。

C# Volatile (How It Works For Developers): Figure 5

此範例演示了在多執行緒環境中穩健地生成PDF文件的方法,利用IronPDF和volatile關鍵字。 我們通過利用_isRunning標識的變更在執行緒間立即可見,有效地控制了PDF的生成過程。 我們也使用鎖來存取和更改_isRunning標誌,同時保持工人執行緒的安全。

C# Volatile (How It Works For Developers): Figure 6

結論

總之,在IronPDF中融入volatile關鍵字提供了一種有力的方式,以保障在多執行緒C#程式中建立PDF時的執行緒安全。 我們通過指定共享控制標誌為易變,確保跨執行緒的變更能夠被及時看見,並適當同步,從而有效控制PDF的生產過程。

通過確保對控制標誌的變更立即廣播給所有執行緒,volatile能避免衝突且促進PDF建立過程中的過程的有效協調。

應用程式能夠同時有效地管理多個PDF生成過程而不用擔心資料損壞或競爭情況,這種方法提高了在並發環境下PDF建立的可擴展性和可靠性。

最後,透過包括IronPDF及探索Iron Software的完整程式庫潛力,您能有效地與條碼協作,建立PDF,進行OCR及與Excel互連。 Iron Software輕鬆結合其多功能套件的性能、相容性和易用性,提供更強大的應用能力和更有效的開發過程。

若有清晰的許可選項並符合專案的特定需求,開發者可信心十足地選擇最佳的模型。 這些優勢允許開發者以高效率和透明性處理多種挑戰。

Jacob Mellor,首席技術官 @ Team Iron
首席技術官

Jacob Mellor是Iron Software的首席技術官,一位在C# PDF技術上開創先河的遠見工程師。作為Iron Software核心程式碼庫的原開發者,他從創立以來就一直在塑造公司的產品架構,與首席執行官Cameron Rimington一起將公司轉變為服務於NASA、特斯拉和全球政府公司的50多名人員的公司。

...
閱讀更多

相關文章

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

受到全球數百萬工程師的信任

Iron Software的客戶標誌
獲取您的無義務諮詢
填寫以下表格或電子郵件sales@ironsoftware.com
您的詳細資訊將始終保密。
受到全球數百萬工程師的信任
Iron Software的客戶標誌
立即獲取您的30天試用金鑰。
無需信用卡或帳戶建立
C# 用於PDF的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起