跳過到頁腳內容
.NET幫助

C# 計時器(對於開發者的運行原理)

C# 中的 Timer 類別是強大的工具,可用於依指定時間間隔安排程式碼的執行。 無論您是開發 Windows 窗體應用程式還是控制台應用程序,請了解如何使用計時器都可以大幅增強應用程式的功能。 本教學將引導您了解在 C# 中使用計時器的基礎知識,包括如何設定計時器、處理計時器的事件以及確保計時器在您的應用程式中順利運作。 我們還將討論如何在 C# 應用程式中使用IronPDF實現 PDF 自動生成,以及如何使用 C# 中的計時器自動生成 PDF。

Introduction to Timer Classes in C

C# 定時器(開發者使用方法):圖 1 - 定時器類別

C# 提供了多個計時器類,每個類別都適用於不同的任務和環境。 最常用的計時器類別是用於伺服器端計時器的System.Timers.Timer和用於 Windows 窗體應用程式的System.Windows.Forms.Timer 。 在使用計時器類別時,了解事件處理程序的作用至關重要,因為這些處理程序決定了計時器在每個重要時刻(例如滴答或經過的事件時間間隔)執行的操作。

設定新計時器

配置定時器的時間間隔是其運作的基礎,它決定了定時器事件處理程序的呼叫頻率,從而控制應用程式對時間敏感的功能的節奏。 要在 C# 應用程式中使用計時器,尤其是在開發 Windows 窗體應用程式時,首先需要將工具箱中的System.Windows.Forms.Timer元件新增至窗體上,或透過程式設計設定計時器物件以獲得更大的靈活性。

var timer = new System.Timers.Timer(); // Create a new timer
timer.Interval = 2000; // Sets the timer interval to tick every 2 seconds
var timer = new System.Timers.Timer(); // Create a new timer
timer.Interval = 2000; // Sets the timer interval to tick every 2 seconds
$vbLabelText   $csharpLabel

這個簡單的設定會建立一個每 2 秒滴答一次的計時器。 但是,要使定時器執行操作,需要將其連接到事件處理程序。

處理已過期事件

透過將 Elapsed 事件處理程序附加到System.Timers.TimerElapsed事件,您可以確保應用程式可以在每個時間間隔執行任務,從而有效地回應基於時間的觸發器。 每次計時器的時間間隔到期時,都會觸發此事件。 您可以為此事件附加一個處理程序,以指定計時器滴答時應該發生什麼:

timer.Elapsed += OnTimedEvent;
timer.Elapsed += OnTimedEvent;
$vbLabelText   $csharpLabel

在上面的程式碼中, OnTimedEvent是你定義的一個方法,每當計時器的Elapsed事件被觸發時,都會呼叫該方法。

建立事件處理程序

在定義定時器事件處理程序時,您可以建立一個響應定時器滴答事件而執行的方法,從而可以精確控制按預定義時間間隔執行的操作。 計時器的Elapsed事件的處理程序通常如下所示:

static void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
{
    Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}", e.SignalTime);
}
static void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
{
    Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}", e.SignalTime);
}
$vbLabelText   $csharpLabel

此方法會在計時器到期時向控制台列印目前時間,以示範如何回應計時器事件。

啟動和停止計時器

設定計時器及其事件處理程序後,需要啟動計時器。 您可以透過將其Enabled屬性設為true或呼叫Start方法來實現這一點:

timer.Enabled = true; // or timer.Start();
timer.Enabled = true; // or timer.Start();
$vbLabelText   $csharpLabel

若要停止計時器,您可以將Enabled設定為false或呼叫Stop方法。 這對於防止應用程式在不需要時運行不必要的操作至關重要。

在 Windows 窗體應用程式中使用計時器

System.Windows.Forms.Timer是一個有價值的 Windows 窗體組件,旨在與 Windows 窗體應用程式的事件驅動模型無縫集成,從而在不影響用戶介面響應速度的情況下實現定期操作。

範例:向表單新增計時器

在 Windows 窗體應用程式中,您可以將計時器控制項從工具箱拖曳到窗體上,或像這樣以程式設計方式建立它:

System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Interval = 1000; // 1 second interval
myTimer.Tick += new EventHandler(TimerEventProcessor);
myTimer.Start();
System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Interval = 1000; // 1 second interval
myTimer.Tick += new EventHandler(TimerEventProcessor);
myTimer.Start();
$vbLabelText   $csharpLabel

這裡, TimerEventProcessor是一個事件處理程序,每次發生Tick事件時都會被調用,這類似於System.Timers.Timer中的Elapsed事件。

進階定時器管理

帶定時器的螺紋安全

使用定時器時,了解應用程式的線程模型至關重要。 System.Timers.TimerSystem.Threading.Timer在執行緒池執行緒上執行其回呼函數,從而允許並行執行。 但是,如果您的回呼方法修改共享資料或與使用者介面元素交互,則可能會導致執行緒安全性問題。 若要從定時器的回呼安全地更新 UI 元素,必須使用特定於應用程式類型的技術(例如,在 Windows Forms 中使用InvokeBeginInvoke )將回呼封送到 UI 執行緒。

高精度計時

對於需要高精度計時的應用(例如多媒體應用或遊戲), System.Diagnostics.Stopwatch類別可能比計時器更適合高精度測量經過的時間。 雖然Stopwatch類別本身不是計時器,但可以與計時器結合使用,以實現精確的時間測量。

實際案例

範例:實現倒數計時器

計時器的一個常見用途是創建倒數計時器。 這可以透過將定時器間隔設為一秒鐘(1000 毫秒),並在定時器每次用完時減少計數器來實現。 當計數器歸零時,計時器停止,表示倒數結束。

using System;

namespace CountdownApp
{
    class Program
    {
        static int countdownTime = 10; // Countdown from 10 seconds

        public static void Main(string[] args) // Main method
        {
            StartCountdown();
            Console.ReadLine(); // Prevent console from closing immediately
        }

        static void StartCountdown()
        {
            var timer = new System.Timers.Timer(1000); // Tick every second
            timer.Elapsed += UpdateCountdown;
            timer.Enabled = true;
        }

        static void UpdateCountdown(Object source, System.Timers.ElapsedEventArgs e)
        {
            if (countdownTime > 0)
            {
                Console.WriteLine(countdownTime-- + " seconds remaining");
            }
            else
            {
                Console.WriteLine("Countdown finished!");
                ((System.Timers.Timer)source).Stop(); // Stop the timer
            }
        }
    }
}
using System;

namespace CountdownApp
{
    class Program
    {
        static int countdownTime = 10; // Countdown from 10 seconds

        public static void Main(string[] args) // Main method
        {
            StartCountdown();
            Console.ReadLine(); // Prevent console from closing immediately
        }

        static void StartCountdown()
        {
            var timer = new System.Timers.Timer(1000); // Tick every second
            timer.Elapsed += UpdateCountdown;
            timer.Enabled = true;
        }

        static void UpdateCountdown(Object source, System.Timers.ElapsedEventArgs e)
        {
            if (countdownTime > 0)
            {
                Console.WriteLine(countdownTime-- + " seconds remaining");
            }
            else
            {
                Console.WriteLine("Countdown finished!");
                ((System.Timers.Timer)source).Stop(); // Stop the timer
            }
        }
    }
}
$vbLabelText   $csharpLabel

以下是上述程式碼的輸出結果:

C# 定時器(開發者使用方法):圖 2 - 倒數計時器輸出

範例:安排定期資料庫檢查

可以使用定時器對資料庫執行定期檢查,例如查詢新資料或清理舊記錄。 此範例設定了一個定時器,每小時查詢一次資料庫:

private static void SetupDatabaseCheckTimer()
{
    var timer = new System.Timers.Timer(3600000); // Set to 1 hour
    timer.Elapsed += CheckDatabase;
    timer.Enabled = true;
}

private static void CheckDatabase(Object source, System.Timers.ElapsedEventArgs e)
{
    // Perform database operations here
    Console.WriteLine("Database checked at " + e.SignalTime);
}
private static void SetupDatabaseCheckTimer()
{
    var timer = new System.Timers.Timer(3600000); // Set to 1 hour
    timer.Elapsed += CheckDatabase;
    timer.Enabled = true;
}

private static void CheckDatabase(Object source, System.Timers.ElapsedEventArgs e)
{
    // Perform database operations here
    Console.WriteLine("Database checked at " + e.SignalTime);
}
$vbLabelText   $csharpLabel

IronPDF簡介

IronPDF - 可輕鬆從 HTML 和 ASPX 生成 PDF,尤其因其能夠輕鬆地從 HTML 或 URL 生成 PDF 而備受讚譽,它本質上允許您的應用程式將任何HTML 內容"列印"為 PDF 文件。 這對於產生報告、發票或任何需要以標準化格式呈現的網頁內容都非常有用。 IronPDF也支援 CSS 樣式、 JavaScript和自訂字體等進階功能,確保產生的 PDF 檔案能夠保持網頁內容的完整性。

IronPDF的一個顯著特點是其HTML 轉 PDF功能,能夠保留佈局和樣式。 它可以產生網頁內容的 PDF 文件,非常適合用於報告、發票和文件。 HTML 檔案、URL 和 HTML 字串可以輕鬆轉換為 PDF。

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");
    }
}
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");
    }
}
$vbLabelText   $csharpLabel

安裝IronPDF

您可以使用NuGet套件管理器安裝IronPDF,方法是執行以下命令:

Install-Package IronPdf

例子

假設你需要產生一份每日更新的PDF格式報告,其中包含每天更新的數據。 為了簡單起見,我們將產生一個基本的 HTML 報告,並每 24 小時使用IronPDF將其轉換為 PDF。 在你的 C# 應用程式中,你將設定一個System.Timers.Timer ,使其每 24 小時觸發一次。 需要注意的是,間隔是以毫秒為單位設定的,因此 24 小時表示為 24 * 60 * 60 * 1000 毫秒。

using System;
using System.Timers;
using IronPdf;
using Timer = System.Timers.Timer;

class Program
{
    static void Main(string[] args)
    {
        // Set up the timer for 24 hours
        Timer timer = new Timer(24 * 60 * 60 * 1000);
        timer.Elapsed += OnTimedEvent;
        timer.AutoReset = true;
        timer.Enabled = true;

        Console.WriteLine("Press Enter to exit the program.");
        Console.ReadLine();
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        GeneratePdfReport();
    }

    private static void GeneratePdfReport()
    {
        var renderer = new HtmlToPdf();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Daily Report</h1><p>This is the automated daily report.</p>");
        string outputPath = $"f:\\DailyReport_{DateTime.Now:yyyyMMdd}.pdf";
        pdf.SaveAs(outputPath);
        Console.WriteLine($"Generated PDF report at {outputPath}");
    }
}
using System;
using System.Timers;
using IronPdf;
using Timer = System.Timers.Timer;

class Program
{
    static void Main(string[] args)
    {
        // Set up the timer for 24 hours
        Timer timer = new Timer(24 * 60 * 60 * 1000);
        timer.Elapsed += OnTimedEvent;
        timer.AutoReset = true;
        timer.Enabled = true;

        Console.WriteLine("Press Enter to exit the program.");
        Console.ReadLine();
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        GeneratePdfReport();
    }

    private static void GeneratePdfReport()
    {
        var renderer = new HtmlToPdf();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Daily Report</h1><p>This is the automated daily report.</p>");
        string outputPath = $"f:\\DailyReport_{DateTime.Now:yyyyMMdd}.pdf";
        pdf.SaveAs(outputPath);
        Console.WriteLine($"Generated PDF report at {outputPath}");
    }
}
$vbLabelText   $csharpLabel

輸出

運行程式碼後,控制台將顯示以下輸出。 為了加快輸出速度,我修改了程式碼,使用了 10 秒的計時器。

C# 定時器(開發者工作原理):圖 3 - 控制台輸出

以下是生成的PDF檔案:

C# 定時器(開發者使用方法):圖 4 - PDF 報告

結論

C# 定時器(開發者使用方法):圖 5 - 授權

總而言之,將 C# 計時器與IronPDF集成,為在.NET應用程式中自動產生和管理 PDF 文件提供了一種強大的方法。 透過提供的範例,我們探討如何設定 C# 定時器以定期觸發 PDF 產生任務,無論是為了頻繁的測試目的還是為了按計劃產生報告。

使用 C# 定時器,我們可以精確控制與 PDF 相關的任務何時執行,從而實現定期更新、產生報告或任何需要按計劃進行的任務。 IronPDF透過提供一種簡單且有效率的方式來建立、操作和保存基於動態內容、HTML 甚至網頁的 PDF 文檔,從而增強了這項功能。

IronPDF提供許可資訊免費試用版,並提供許可證以獲得完整存取權限和支援。 這提供了一種經濟高效的方式,可以在.NET應用程式中實現全面的 PDF 功能。

常見問題解答

C#中有哪些主要的Timer類別?

C#提供了幾種Timer類別,包括用於伺服器應用的System.Timers.Timer和用於Windows Forms應用的System.Windows.Forms.Timer,各自滿足不同的多執行緒和執行需求。

如何在 C# 中將 HTML 轉換為 PDF?

您可以使用IronPDF的RenderHtmlAsPdf方法將HTML轉換為PDF,此方法支援CSS和JavaScript等進階功能,非常適合生成報告和發票。

如何在C#應用中設置和管理Timer?

要在C#應用中設置Timer,需要創建一個Timer類別的實例,指定其間隔,然後將事件處理器附加到其ElapsedTick事件,以便定期執行程式碼。

在C#應用中使用Timer有什麼好處?

C#中的Timer對於自動執行任務非常有用,例如安排定期的資料庫檢查、實現倒計時器和觸發自動化過程(如PDF生成)。

IronPDF如何在C#中自動化PDF生成?

IronPDF可以通過使用C#的Timer在預定的間隔時間觸發PDF創建過程,例如生成每日報告或發票。

如何處理System.Timers.Timer的多執行緒問題?

System.Timers.Timer在執行回調時使用執行緒池執行緒,這可能導致執行緒安全問題。適當的管理包括確保使用InvokeBeginInvoke等技術將UI更新封送回UI執行緒。

如何從C#的Timer事件更新UI組件?

要從C#的Timer事件更新UI組件,必須將呼叫封送回UI執行緒,通常在Windows Forms應用中使用InvokeBeginInvoke方法。

Timer如何增強C#應用的功能?

Timer可以通過允許在特定間隔安排任務來增強功能,通過自動化提高應用的效率和響應能力。

如何在C#專案中安裝和使用IronPDF?

IronPDF可以通過NuGet包管理器以此指令安裝:Install-Package IronPDF。安裝後,您可以使用其方法將HTML轉換為PDF並自動化PDF生成。

有哪些實際範例演示在C#中使用Timer?

C#中Timer的實際範例包括實現倒計時器、安排定期的資料庫更新,以及使用IronPDF自動化每日的PDF報告生成。

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

Jacob Mellor是Iron Software的首席技術官,也是開創C# PDF技術的前瞻性工程師。作為Iron Software核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

Jacob擁有曼徹斯特大學土木工程一級榮譽學士學位(1998年–2001年)。他於1999年在倫敦開立首家軟體公司,並於2005年建立了他的第一個.NET組件,專注於解決Microsoft生態系統中的複雜問題。

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me