.NET 帮助

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

发布 2024年三月6日
分享:

介绍

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

C# 中的定时器类介绍;

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在线程池线程上执行回调,允许并行执行。 但是,如果您的回调方法修改共享数据或与用户界面元素交互,这可能会导致线程安全问题。 要安全地从定时器的回调中更新 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
        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 和 ASPX 轻松生成 PDF尤其值得称道的是,它可以轻松地从 HTML 或 URL 生成 PDF,基本上可以让您的应用程序 "打印 "任作为 PDF 文档的 HTML 内容. 这对于生成报告、发票或任何需要以标准化格式呈现的网络内容都非常有用。 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 报告,并每 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
VB   C#

输出

运行代码后,控制台将显示以下输出。 在这里,我修改了代码,以便快速输出,因此使用了 10 秒计时器。

C# 定时器(如何为开发人员工作):图 3 - 控制台输出

以下是生成的 PDF:

C# 定时器(如何为开发人员工作):图 4 - PDF 报告

结论

C# 定时器(如何为开发人员工作):图 5 - 许可

总之,将 C# 定时器与 IronPDF 集成,为在 .NET 应用程序中自动生成和管理 PDF 文档提供了一种强大的方法。 通过所提供的示例,我们探讨了如何设置 C# 定时器,以定期触发 PDF 生成任务,无论是出于频繁测试的目的还是计划生成报告的目的。

使用 C# 定时器,我们可以精确控制 PDF 相关任务的执行时间,从而实现定期更新、生成报告或任何需要按计划执行的任务。 IronPDF 提供了一种直接高效的方法来创建、处理和保存基于动态内容、HTML 甚至网页的 PDF 文档,从而增强了这种能力。

IronPDF 提供一个附带许可信息的免费试用版译文必须符合国际通用语言标准,并附有可完全访问和支持的许可证。 这为在您的 .NET 应用程序中实现全面的 PDF 功能提供了一种具有成本效益的方法。

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

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

免费NuGet下载 总下载量: 11,781,565 查看许可证 >