.NET幫助 C# 計時器(對於開發者的運行原理) Jacob Mellor 更新:7月 28, 2025 下載 IronPDF NuGet 下載 DLL 下載 Windows 安裝程式 開始免費試用 法學碩士副本 法學碩士副本 將頁面複製為 Markdown 格式,用於 LLMs 在 ChatGPT 中打開 請向 ChatGPT 諮詢此頁面 在雙子座打開 請向 Gemini 詢問此頁面 在雙子座打開 請向 Gemini 詢問此頁面 打開困惑 向 Perplexity 詢問有關此頁面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 複製連結 電子郵件文章 C# 中的計時器類是強大的工具,用來排程在指定的時間間隔執行程式碼。 無論您是在開發 Windows Form 應用程式或 Console App,瞭解如何使用 imer 都能大幅提升應用程式的功能。 本教學將介紹在 C# 中使用計時器的基本知識,包括如何設定計時器、處理其事件,以及確保計時器在應用程式中順利運作。 我們還將討論如何使用 IronPDF 在 C# 應用程式中自動產生 PDF 來使用 C# 中的 Timer 自動產生我們的 PDF。 C# 中的計時器類簡介; C# 提供多種定時器類別,每種都適合不同的任務和環境。 最常用的計時器類別是:System.Timers.Timer,用於伺服器型計時器;System.Windows.Forms.Timer,用於 Windows Forms 應用程式。 在使用計時器類別時,瞭解事件處理器的作用至關重要,因為這些處理器決定了在計時器所決定的每個重要時刻所執行的動作,例如 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 的 Elapsed 事件,您可確保您的應用程式能在每個間隔執行任務,有效回應以時間為基礎的觸發器。 每次計時器的時間間隔過後,都會啟動此事件。 您可以將處理器附加至此事件,以指定當計時器滴答作響時應該發生的事情: timer.Elapsed += OnTimedEvent; timer.Elapsed += OnTimedEvent; timer.Elapsed += OnTimedEvent $vbLabelText $csharpLabel 在上述程式碼中,OnTimedEvent 是您定義的方法,每當觸發計時器的 Elapsed 事件時,該方法就會被呼叫。 建立事件處理程式 在定義計時器事件處理器時,您會精心設計一個方法,以回應計時器的 tick 事件,從而精確控制在預定義的時間間隔內執行的動作。 計時器 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); } 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 中的 Elapsed 事件類似。 進階計時器管理 使用計時器的線程安全 在使用計時器時,了解應用程式的線程模型至關重要。 System.Timers.Timer和System.Threading.Timer在線程池線程上執行其回呼,允許並行執行。 然而,如果您的回呼方法修改共用資料或與使用者介面元素互動,這可能會導致線程安全問題。 若要安全地從計時器的回呼更新 UI 元素,您必須使用應用程式類型的特定技術(例如,在 Windows Forms 中使用 Invoke 或 BeginInvoke)將回呼轉移至 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 } } } } 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 以下是上述程式碼的輸出: !a href="/static-assets/pdf/blog/csharp-timer/csharp-timer-2.webp">C# Timer (How It Works For Developers):圖 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 - 從 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"); } } 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 Package Manager 執行此指令來安裝 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}"); } } 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 秒的計時器。 以下是生成的 PDF: 結論 總而言之,將 C# Timers 與 IronPDF 整合在一起呈現了一種強大的方法,可在 .NET 應用程式中自動生成和管理 PDF 文件。 透過所提供的範例,我們探討了如何設定 C# 計時器,以定期觸發 PDF 產生任務,不論是為了頻繁測試的目的,或是排程報告的產生。 使用 C# 計時器,我們可以精確地控制 PDF 相關任務的執行時間,讓定期更新、報表產生或任何需要在排程中發生的任務得以執行。 IronPdf 提供了一種直接而有效的方式來建立、處理和儲存基於動態內容、HTML 或甚至網頁的 PDF 文件,從而增強了這種能力。 IronPdf 提供免費試用與授權資訊,並可取得授權以獲得完整的使用權與支援。 這提供了一個符合成本效益的方式,在您的 .NET 應用程式中實作全面的 PDF 功能。 常見問題解答 C# 中有哪些主要的定時器類別? C# 提供了多種計時器類,包括適用於伺服器型應用程式的 System.Timers.Timer 和適用於 Windows Forms 應用程式的 System.Windows.Forms.Timer 兩種,各自服務於不同的線程及執行需求。 如何在 C# 中將 HTML 轉換為 PDF? 您可以使用 IronPDF 的 RenderHtmlAsPdf 方法在 C# 中將 HTML 轉換為 PDF,此方法支援 CSS 和 JavaScript 等進階功能,非常適合產生報表和發票。 如何在 C# 應用程式中設定並管理計時器? 若要在 C# 應用程式中設定計時器,請建立計時器類的實體,指定其間隔時間,並將事件處理器附加至其 Elapsed 或 Tick 事件,讓您可以在固定的間隔時間執行程式碼。 在 C# 應用程式中使用計時器有什麼好處? C# 中的計時器有利於自動化任務,例如排程定期檢查資料庫、執行倒數計時器,以及觸發 PDF 產生等自動化流程。 IronPDF 如何在 C# 中自動生成 PDF? IronPDF 可透過 C# 計時器在排定的時間間隔內觸發 PDF 建立程序,例如產生每日報告或發票,從而自動產生 PDF。 如何處理 System.Timers.Timer 的線程問題? System.Timers.Timer在線程池線程上執行回呼,這可能會導致線程安全問題。正確的管理包括使用 Invoke 或 BeginInvoke 等技術,確保 UI 更新被遷移回 UI 線程。 如何從 C# 中的計時器事件更新 UI 元件? 若要從 C# 中的計時器事件更新 UI 元件,您必須將呼喚遷移回 UI 線程,通常是使用 Windows Forms 應用程式中的 Invoke 或 BeginInvoke 方法。 計時器如何增強 C# 應用程式的功能? 計時器可讓任務排程到特定的時間間隔,藉由自動化提高應用程式的效率和回應能力,進而強化功能。 如何在 C# 專案中安裝和使用 IronPDF? IronPDF 可使用 NuGet Package Manager 在 C# 專案中安裝,指令如下:Install-Package IronPdf。安裝完成後,您可以使用其方法將 HTML 轉換為 PDF 並自動生成 PDF。 有哪些實例可以展示 C# 中計時器的使用? C# 中計時器的實用範例包括實作倒數計時器、排程定期更新資料庫,以及使用 IronPDF 自動產生每日 PDF 報告。 Jacob Mellor 立即與工程團隊聊天 首席技术官 Jacob Mellor 是 Iron Software 的首席技術官,作為 C# PDF 技術的先鋒工程師。作為 Iron Software 核心代碼的原作者,他自開始以來塑造了公司產品架構,與 CEO Cameron Rimington 一起將其轉變為一家擁有超過 50 名員工的公司,為 NASA、特斯拉 和 全世界政府機構服務。Jacob 持有曼徹斯特大學土木工程一級榮譽学士工程學位(BEng) (1998-2001)。他於 1999 年在倫敦開設了他的第一家軟件公司,並於 2005 年製作了他的首個 .NET 組件,專注於解決 Microsoft 生態系統內的複雜問題。他的旗艦產品 IronPDF & Iron Suite .NET 庫在全球 NuGet 被安裝超過 3000 萬次,其基礎代碼繼續為世界各地的開發工具提供動力。擁有 25 年的商業經驗和 41 年的編碼專業知識,Jacob 仍專注於推動企業級 C#、Java 及 Python PDF 技術的創新,同時指導新一代技術領袖。 相關文章 更新12月 11, 2025 銜接 CLI 簡化與 .NET : 使用 Curl DotNet 與 IronPDF for .NET Jacob Mellor 藉由 CurlDotNet 彌補了這方面的不足,CurlDotNet 是為了讓 .NET 生態系統能熟悉 cURL 而建立的函式庫。 閱讀更多 更新9月 4, 2025 RandomNumberGenerator C# 使用RandomNumberGenerator C#類可以幫助將您的PDF生成和編輯項目提升至新水準 閱讀更多 更新9月 4, 2025 C#字符串等於(它如何對開發者起作用) 當結合使用強大的PDF庫IronPDF時,開關模式匹配可以讓您構建更智能、更清晰的邏輯來進行文檔處理 閱讀更多 Graphql C#(對於開發者的運行原理)Math.Round C#(對於開發者的...
更新12月 11, 2025 銜接 CLI 簡化與 .NET : 使用 Curl DotNet 與 IronPDF for .NET Jacob Mellor 藉由 CurlDotNet 彌補了這方面的不足,CurlDotNet 是為了讓 .NET 生態系統能熟悉 cURL 而建立的函式庫。 閱讀更多