跳過到頁腳內容
.NET幫助

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

C# 中的定時器類是用於在指定間隔執行代碼的強大工具。 無論您是在開發 Windows 表單應用程序還是控制台應用程序,了解如何使用 定時器 可以大大提升應用程序的功能。 本教程將帶您了解如何在 C# 中使用定時器的基本知識,包括如何設置、處理由定時器觸發的事件以及確保它們在應用程序中順利運行。 我們還將討論如何使用 IronPDF 在 C# 應用中自動生成 PDF 來通過 C# 中的定時器自動化我們的 PDF 生成。

C# 中定時器類介紹

C# 定時器(開發人員如何運作): 圖 1 - 定時器類

C# 提供了幾種定時器類,每種適合不同的任務和環境。 最常用的定時器是用於基於服務器的定時器的 System.Timers.Timer 和用於 Windows 表單應用程序的 System.Windows.Forms.Timer。 了解事件處理程序的角色在使用定時器類時至關重要,因為這些處理程序決定了定時器在每個重要時刻(例如 tick 或經過的事件時間間隔)執行的操作。

設定新的定時器

配置您的定時器的時間間隔是其操作的基礎,這決定了定時器事件處理程序被調用的頻率,從而控制應用程序時間敏感功能的節奏。 在您的 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
Dim timer = New System.Timers.Timer() ' Create a new timer
timer.Interval = 2000 ' Sets the timer interval to tick every 2 seconds
$vbLabelText   $csharpLabel

此簡單設置創建了一個每 2 秒響一次的定時器。 但是,為了使定時器執行操作,您需要將其連接到事件處理程序。

處理經過的事件

通過將經過事件處理程序附加到 System.Timers.Timer經過 事件上,您確保應用程序可以在每個間隔執行任務,有效地響應基於時間的觸發。 每當定時器的間隔過去時,此事件就會觸發。 您需要將處理程序附加到此事件上,以指定定時器滴答時應該發生的情況:

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

在上述代碼中,OnTimedEvent 是一個您定義的方法,將在定時器的 經過 事件被觸發時被調用。

創建事件處理程序

在定義一個定時器事件處理程序時,您需要編寫一個方法來響應定時器的滴答事件,從而精確控制在預定間隔執行的操作。 一個定時器的 經過 事件的事件處理程序通常如下所示:

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);
}
Shared Sub OnTimedEvent(ByVal source As Object, ByVal e As System.Timers.ElapsedEventArgs)
	Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}", e.SignalTime)
End Sub
$vbLabelText   $csharpLabel

此方法在定時器過期時將當前時間打印到控制台,演示如何響應定時器事件。

啟動和停止定時器

在設置好定時器及其事件處理程序後,您需要啟動定時器。 您可以通過將 Enabled 屬性設置為 true 或調用 Start 方法來實現。

timer.Enabled = true; // or timer.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();
Dim myTimer As New System.Windows.Forms.Timer()
myTimer.Interval = 1000 ' 1 second interval
AddHandler myTimer.Tick, AddressOf TimerEventProcessor
myTimer.Start()
$vbLabelText   $csharpLabel

此處,TimerEventProcessor 是一個事件處理程序,將在每次 Tick 事件發生時被調用,這類似於 System.Timers.Timer經過 事件。

高級定時器管理

定時器的線程安全

在使用定時器時,了解應用程序的線程模型是至關重要的。 System.Timers.TimerSystem.Threading.Timer 在線程池線程上執行回調,允許並行執行。 但是,如果您的回調方法修改共享數據或交互用戶界面元素,這可能會導致線程安全問題。 要從定時器的回調安全地更新 UI 元素,您必須使用特定於應用程序類型的技術將調用回傳到 UI 線程(例如,在 Windows 表單中使用 InvokeBeginInvoke)。

高精度計時

對於需要高精度計時(例如多媒體應用程序或遊戲)的應用程序,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
            }
        }
    }
}
Imports System

Namespace CountdownApp
	Friend Class Program
		Private Shared countdownTime As Integer = 10 ' Countdown from 10 seconds

		Public Shared Sub Main(ByVal args() As String) ' Main method
			StartCountdown()
			Console.ReadLine() ' Prevent console from closing immediately
		End Sub

		Private Shared Sub StartCountdown()
			Dim timer = New System.Timers.Timer(1000) ' Tick every second
			AddHandler timer.Elapsed, AddressOf UpdateCountdown
			timer.Enabled = True
		End Sub

		Private Shared Sub UpdateCountdown(ByVal source As Object, ByVal e As System.Timers.ElapsedEventArgs)
			If countdownTime > 0 Then
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Console.WriteLine(countdownTime-- + " seconds remaining");
				Console.WriteLine(countdownTime & " seconds remaining")
				countdownTime -= 1
			Else
				Console.WriteLine("Countdown finished!")
				DirectCast(source, System.Timers.Timer).Stop() ' Stop the timer
			End If
		End Sub
	End Class
End Namespace
$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);
}
Private Shared Sub SetupDatabaseCheckTimer()
	Dim timer = New System.Timers.Timer(3600000) ' Set to 1 hour
	AddHandler timer.Elapsed, AddressOf CheckDatabase
	timer.Enabled = True
End Sub

Private Shared Sub CheckDatabase(ByVal source As Object, ByVal e As System.Timers.ElapsedEventArgs)
	' Perform database operations here
	Console.WriteLine("Database checked at " & e.SignalTime)
End Sub
$vbLabelText   $csharpLabel

IronPDF 简介

IronPDF - Easily Generate PDF from HTML and ASPX is particularly praised for its ease of use in generating PDFs from HTML or URLs, essentially allowing your application to "print" any HTML內容作為 PDF文檔。 這對於生成報告、發票或需以標準化格式呈現的任何 Web 內容非常有用。 IronPDF 還支持高級功能,如 CSS 樣式、JavaScript 和自定義字體,確保生成的 PDF 保留 Web 內容的完整性。

IronPDF 的一個突出的特徵是其 HTML到PDF的轉換 能力,能夠保留佈局和樣式。 它從 Web 內容生成 PDF,這對報告、發票和文檔非常理想。 HTML 文件、網址和 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");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

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

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

		' 3. Convert URL to PDF
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

安裝 IronPDF

您可以通過執行此命令使用 NuGet 包管理器安裝 IronPDF:

Install-Package IronPdf

示例

想像一下,您需要生成一份包含每日更新數據的 PDF 格式的日報。 為了簡單起見,我們將生成一個基本的 HTML 報告並使用 IronPDF 每 24 小時將其轉換為 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}");
    }
}
Imports System
Imports System.Timers
Imports IronPdf
Imports Timer = System.Timers.Timer

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Set up the timer for 24 hours
		Dim timer As New Timer(24 * 60 * 60 * 1000)
		AddHandler timer.Elapsed, AddressOf OnTimedEvent
		timer.AutoReset = True
		timer.Enabled = True

		Console.WriteLine("Press Enter to exit the program.")
		Console.ReadLine()
	End Sub

	Private Shared Sub OnTimedEvent(ByVal source As Object, ByVal e As ElapsedEventArgs)
		GeneratePdfReport()
	End Sub

	Private Shared Sub GeneratePdfReport()
		Dim renderer = New HtmlToPdf()
		Dim pdf = renderer.RenderHtmlAsPdf("<h1>Daily Report</h1><p>This is the automated daily report.</p>")
		Dim outputPath As String = $"f:\DailyReport_{DateTime.Now:yyyyMMdd}.pdf"
		pdf.SaveAs(outputPath)
		Console.WriteLine($"Generated PDF report at {outputPath}")
	End Sub
End Class
$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報告生成。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。