跳至页脚内容
.NET 帮助

C# Timer(开发者如何使用)

C#中的计时器类是强大的工具,用于按照指定时间间隔安排代码的执行。 无论您是在开发Windows窗体应用程序还是控制台应用程序,了解如何使用计时器可以极大地增强您应用程序的功能。 本教程将带您了解在C#中使用计时器的基础知识,包括如何设置它们、处理它们的事件以及确保它们在您的应用程序中顺畅运行。 我们还将讨论如何使用IronPDF在C#应用程序中进行自动化PDF生成,以使用计时器在C#中自动化我们的PDF生成。

C#计时器类介绍

C#计时器(开发者如何使用它们):图1 - 计时器类

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

设置新计时器

配置计时器的时间间隔是其操作的基础,确定计时器的事件处理程序被调用的频率,从而控制应用程序时间敏感功能的节奏。 要在您的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
$vbLabelText   $csharpLabel

这个简单的设置创建了一个每2秒滴答一次的计时器。 然而,为了使计时器执行动作,您需要将它连接到事件处理程序。

处理经过事件

通过将经过事件处理程序附加到System.Timers.TimerElapsed事件,您确保您的应用程序可以在每个时间间隔执行任务,有效地响应时间驱动的触发器。 每次计时器的间隔经过时,就会引发此事件。 您可以附加一个处理程序到该事件,以指定计时器滴答时应该发生什么:

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

在上面的代码中,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);
}
$vbLabelText   $csharpLabel

此方法每当计时器经过时,仅在控制台中打印当前时间,演示如何响应计时器事件。

启动和停止计时器

在设置计时器及其事件处理程序后,您需要启动计时器。 您可以通过设置其Enabled属性为true或调用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();
$vbLabelText   $csharpLabel

这里,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(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
            }
        }
    }
}
$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);
}
$vbLabelText   $csharpLabel

IronPDF简介

IronPDF - 轻松从HTML和ASPX生成PDF因其在从HTML或URL生成PDF方面的易用性而备受称赞,实际上使您的应用程序能够"打印"任何HTML内容为PDF文档。 这对于生成报告、发票或需要以标准格式呈现的任何网页内容非常有用。 IronPDF还支持高级功能,如CSS样式、JavaScript和自定义字体,确保生成的PDF保持网页内容的保真度。

IronPDF的一个显著特点是其HTML到PDF转换能力,保留布局和样式。 它从网页内容生成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");
    }
}
$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}");
    }
}
$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#提供的主要计时器类有哪些?

C# 提供了几个计时器类,包括 System.Timers.Timer 用于基于服务器的应用程序和 System.Windows.Forms.Timer 用于 Windows 窗体应用程序,每个类满足不同的线程和执行要求。

如何在C#中将HTML转换为PDF?

你可以通过使用IronPDF的RenderHtmlAsPdf方法在C#中将HTML转换为PDF,该方法支持CSS和JavaScript等高级功能,非常适合生成报告和发票。

如何在C#应用程序中设置和管理计时器?

要在C#应用程序中设置计时器,需要创建计时器类的实例,指定其间隔,并将事件处理程序附加到其ElapsedTick事件,以便在固定间隔执行代码。

在C#应用程序中使用计时器有什么好处?

C#中的计时器有助于自动执行任务,例如安排定期的数据库检查、实现倒计时器并触发类似PDF生成的自动化过程。

IronPDF如何自动化PDF生成在C#中?

IronPDF可以通过使用C#计时器在计划的时间间隔触发PDF创建过程来自动化PDF生成,例如生成每日报告或发票。

如何处理System.Timers.Timer的线程问题?

System.Timers.Timer在线程池线程上执行回调,这可能导致线程安全问题。适当的管理包括确保UI更新通过InvokeBeginInvoke等技术调回UI线程。

如何从计时器事件更新C#中的UI组件?

要从C#中的计时器事件更新UI组件,必须将调用调回UI线程,通常在Windows窗体应用程序中使用InvokeBeginInvoke方法。

计时器如何增强C#应用程序的功能?

计时器通过允许在特定间隔安排任务来增强功能,通过自动化提高应用程序的效率和响应性。

如何在C#项目中安装和使用IronPDF?

使用 NuGet 包管理器在 C# 项目中安装 IronPDF:Install-Package IronPdf,安装后可转换 HTML 为 PDF。

用计时器在C#中的实际应用例子有哪些?

C#中计时器的实际例子包括实现倒计时器、安排定期数据库更新以及使用IronPDF自动化每日PDF报告生成。

Jacob Mellor,Team Iron 的首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技术官,是 C# PDF 技术的先锋工程师。作为 Iron Software 核心代码库的原始开发者,自公司成立以来,他就塑造了公司的产品架构,并与首席执行官 Cameron Rimington 一起将其转变成一家公司,拥有50多人,服务于 NASA、特斯拉和全球政府机构。

Jacob 拥有曼彻斯特大学 (1998-2001) 的一级荣誉土木工程学士学位。1999 年在伦敦创办了自己的第一家软件公司,并于 2005 年创建了他的第一个 .NET 组件后,他专注于解决微软生态系统中的复杂问题。

他的旗舰 IronPDF 和 Iron Suite .NET 库在全球已获得超过 3000 万次的 NuGet 安装,其基础代码继续为全球使用的开发者工具提供支持。拥有 25 年商业经验和 41 年编程经验的 Jacob 仍专注于推动企业级 C#、Java 和 Python PDF 技术的创新,同时指导下一代技术领导者。