.NET 帮助

C# 计时器(其对开发者的运作方式)

发布 2024年三月6日
分享:

简介

C# 中的定时器类是在指定时间间隔调度代码执行的强大工具。无论您是在开发 Windows 窗体应用程序还是控制台应用程序,了解如何使用定时器类都是非常重要的。 定时器 可以大大增强应用程序的功能。本教程将向您介绍在 C# 中使用定时器的基础知识,包括如何设置定时器、处理定时器事件以及确保定时器在应用程序中顺利运行。我们还将讨论 IronPDF 在 C# 中使用定时器自动生成 PDF。

C&num 中的定时器类简介;

C# 定时器(如何为开发人员工作):图 1 - 定时器类

C# 提供了多个计时器类,每个类都适用于不同的任务和环境。最常用的定时器类是System.Timers.Timer(用于基于服务器的定时器)和System.Windows.Forms.Timer(用于 Windows 窗体应用程序)。在使用定时器类时,了解事件处理程序的作用至关重要,因为这些处理程序决定了在定时器规定的每个重要时刻执行的操作,例如滴答声或经过的事件时间间隔。

设置新计时器

配置定时器的时间间隔是其运行的基础,它决定了调用定时器事件处理程序的频率,从而控制应用程序中时间敏感函数的节奏。要在 C# 应用程序中使用定时器,尤其是在开发 Windows 窗体应用程序时,首先要将工具箱中的 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 秒滴答作响的计时器。不过,要让定时器执行操作,需要将其连接到事件处理程序。

处理失效事件

通过在 System.Timers.TimerElapsed 事件中附加一个已失效事件处理程序,可确保应用程序能在每个时间间隔执行任务,有效响应基于时间的触发。每次定时器的时间间隔结束时,都会触发该事件。您可以为该事件附加一个处理程序,以指定定时器滴答作响时应发生的事情:

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

在上述代码中,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
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 窗体应用程序中,您可以将定时器控件从工具箱中拖到窗体上,也可以通过编程创建定时器控件:

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在线程池线程上执行回调,从而实现并行执行。不过,如果您的回调方法修改共享数据或与用户界面元素交互,这可能会导致线程安全问题。要安全地从定时器的回调中更新用户界面元素,您必须使用与应用程序类型相关的技术,将回调调回用户界面线程 (例如,在 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
        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 提供了 免费试用 开发人员可利用"$liteLicense "起价的许可证探索其功能,并获得全面的访问和支持。这为在您的 .NET 应用程序中实现全面的 PDF 功能提供了一种具有成本效益的方法。

< 前一页
GraphQL C#(开发者使用指南)
下一步 >
Math.Round C# (它是如何为开发人员工作的)

准备开始了吗? 版本: 2024.9 刚刚发布

免费NuGet下载 总下载量: 10,746,704 查看许可证 >