.NET 幫助

C# 計時器(開發人員如何使用)

發佈 2024年3月6日
分享:

簡介

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

C#定時器類的介紹

C# 計時器(對開發人員的運作方式):圖 1 - Timer 類別

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

設置新的計時器

配置計時器的時間間隔是其運行的基礎,決定了計時器事件處理程式被調用的頻率,從而控制應用程式時間敏感功能的節奏。要在C#應用程式中使用計時器,特別是在開發Windows Forms應用程式時,可以從工具箱中將 System.Windows.Forms.Timer 元件添加到表單上,或者以編程方式創建計時器物件以獲得更多的靈活性。

var timer = new System.Timers.Timer(); // use a timer
timer.Interval = 2000; // Sets the timer interval to tick every 2 seconds
var timer = new System.Timers.Timer(); // use a timer
timer.Interval = 2000; // Sets the timer interval to tick every 2 seconds
Dim timer = New System.Timers.Timer() ' use a timer
timer.Interval = 2000 ' Sets the timer interval to tick every 2 seconds
VB   C#

這個簡單的設置創建了一個每2秒滴答一次的計時器。然而,為了讓計時器執行動作,你需要將它連接到一個事件處理程序。

處理 Elapsed 事件

通過將經過事件處理程序附加到 System.Timers.TimerElapsed 事件,可以確保您的應用程序能夠在每個間隔執行任務,有效地響應基於時間的觸發器。每次計時器的間隔時間過後,這個事件就會被觸發。將處理程序附加到此事件即可指定計時器滴答時應發生的事情:

timer.Elapsed += OnTimedEvent;
timer.Elapsed += OnTimedEvent;
timer.Elapsed += OnTimedEvent
VB   C#

在上面的代碼中,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);
}
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
VB   C#

此方法僅在計時器逾時時將當前時間列印到控制台,展示如何響應計時器事件。

啟動和停止計時器

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

timer.Enabled = true; // or timer.Start();
timer.Enabled = true; // or timer.Start();
timer.Enabled = True ' or timer.Start();
VB   C#

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

在 Windows 表單應用程式中使用計時器

System.Windows.Forms.Timer 是一個有價值的 Windows 表單元件,設計用於與 Windows 表單應用程式的事件驅動模型無縫整合,在不影響使用者介面回應性的情況下,便於執行定期動作。

示例:在表單中添加計時器

在 Windows Forms 應用中,您可以從工具箱中拖動計時器控制項到您的表單,或者像這樣以程式碼方式創建它:

System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Interval = 1000; // 1 second
myTimer.Tick += new EventHandler(TimerEventProcessor);
myTimer.Start();
System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Interval = 1000; // 1 second
myTimer.Tick += new EventHandler(TimerEventProcessor);
myTimer.Start();
Dim myTimer As New System.Windows.Forms.Timer()
myTimer.Interval = 1000 ' 1 second
AddHandler myTimer.Tick, AddressOf TimerEventProcessor
myTimer.Start()
VB   C#

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

高級計時管理

使用計時器的執行緒安全性

當使用計時器時,理解應用程式的執行緒模型非常重要。System.Timers.TimerSystem.Threading.Timer 在執行回調時會在執行緒池中執行,允許平行執行。然而,如果回調方法修改了共享數據或與使用者介面元素進行互動,這可能會導致執行緒安全性問題。若要安全地從計時器的回調中更新UI元素,必須使用適合應用程式類型的技術將調用封送回UI執行緒。 (例如,使用 InvokeBeginInvoke 在 Windows Forms 中).

高精度計時

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

實用範例

範例:實作倒數計時器

計時器常見的應用場景之一是創建倒數計時器。這可以通過將計時器的間隔設定為一秒來實現。 (1000 毫秒) 並在每次計時器到期時減少計數器。當計數器歸零時,計時器會停止,表示倒數結束。

using System;
namespace CountdownApp
{
    class Program
    {
        static int countdownTime = 10; // Countdown from 10 seconds
// public static void main
        public static void Main(string [] args)
        {
            StartCountdown();
            Console.ReadLine(); // Prevent console from closing immediately
        }
        static void StartCountdown()
        {
            var timer = new System.Timers.Timer(1000); // Tick every second, var timer
            timer.Elapsed += UpdateCountdown;
            timer.Enabled = true;
        }
// public static void printtimes
        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
        public static void Main(string [] args)
        {
            StartCountdown();
            Console.ReadLine(); // Prevent console from closing immediately
        }
        static void StartCountdown()
        {
            var timer = new System.Timers.Timer(1000); // Tick every second, var timer
            timer.Elapsed += UpdateCountdown;
            timer.Enabled = true;
        }
// public static void printtimes
        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 static void main
		Public Shared Sub Main(ByVal args() As String)
			StartCountdown()
			Console.ReadLine() ' Prevent console from closing immediately
		End Sub
		Private Shared Sub StartCountdown()
			Dim timer = New System.Timers.Timer(1000) ' Tick every second, var timer
			AddHandler timer.Elapsed, AddressOf UpdateCountdown
			timer.Enabled = True
		End Sub
' public static void printtimes
		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
VB   C#

上述程式碼的輸出如下:

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

IronPDF 介紹

IronPDF 特別受到讚賞的是其從 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
VB   C#

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

輸出

一旦運行代碼,控制台將顯示以下輸出。我在這裡修改了代碼以便快速輸出,使用了10秒計時器。

C# 計時器(供開發人員使用的工作原理):圖3 - 主控台輸出

以下是生成的 PDF:

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

結論

C# 計時器(開發者如何使用):圖 5 - 授權

總結來說,將 C# 計時器與 IronPDF 整合是一種強大的方法,可以自動化在 .NET 應用程式中生成和管理 PDF 文件。通過所提供的示例,我們探討了如何設置 C# 計時器以定期觸發 PDF 生成任務,無論是為了頻繁的測試還是定期報告生成。

使用 C# 計時器,我們可以精確控制何時執行與 PDF 相關的任務,這樣就可以定期更新、生成報告或進行任何需要按時間表進行的任務。IronPDF 提供了一種簡單而高效的方式來基於動態內容、HTML 或甚至網頁來創建、操作和保存 PDF 文件,增強了這一功能。

IronPDF 提供了 免費試用 供開發人員探索其功能,提供從 $749 起的許可證,可獲得全面的訪問和支援。這提供了一種經濟有效的方式來在你的 .NET 應用程式中實現全面的 PDF 功能。

< 上一頁
Graphql C#(開發者如何操作)
下一個 >
Math.Round C#(對開發人員的運作方式)

準備開始了嗎? 版本: 2024.10 剛剛發布

免費 NuGet 下載 總下載次數: 10,993,239 查看許可證 >