赞
踩
计时器在 C# 中对于 UI 编程、游戏和具有基于时间间隔的逻辑的应用程序非常有用。
C# 通过 .NET 提供的计时器可以轻松地对时间间隔进行计时,也可以在特定的时间间隔内执行特定的任务。
C# Timer 类是一个 .NET 类,可帮助您创建将按设定时间间隔发生的事件。该界面使启动和停止计时器或启用和禁用它变得容易。
使用计时器类时的关键术语是:
要在 C# 中使用计时器,请按照下列步骤操作:
用您想要的毫秒间隔设置计时器。
System.Timers.Timer timer = new (interval: 1000);
定义Elapsed
事件处理程序。每次经过 interval 毫秒后,计时器都会调用此处理程序。
- void HandleTimer()
- {
- Console.WriteLine("Interval Called");
- }
设置计时器以调用您的事件处理程序:
timer.Elapsed += ( sender, e ) => HandleTimer();
调用 Start() 方法启动计时器。
timer.Start();
完成计时器后,调用 Dispose() 方法释放计时器使用的资源。
timer.Dispose();
把它们放在一起:
- using System;
- public class Program
- {
- public static void Main()
- {
- void HandleTimer()
- {
- Console.WriteLine("Interval Called");
- }
- System.Timers.Timer timer = new (interval: 1000 );
- timer.Elapsed += ( sender, e ) => HandleTimer();
- timer.Start();
-
- Console.ReadLine(); // To make sure the console app keeps running.
- System.Threading.Thread.Sleep(10000);
-
- timer.Dispose();
- }
- }
C# 中的 +=(加等于)语法是定义事件处理程序的快捷方式。它告诉计时器订阅事件处理程序。
如果需要,我们也可以使用 -=(减去等于)来取消订阅。
C# 定时器依赖于系统时钟。
系统时钟的分辨率是 Elapsed 事件触发的频率。如果您将 Interval 属性设置为小于解析系统时钟,则它不会以所需的时间间隔触发。
对于大多数用例来说这不是问题。但如果您正在寻找高分辨率计时器,请考虑使用 Stopwatch 类。
Timer 类实现 System.IDisposable 接口,以在处理时释放由它分配的系统资源。
使用 C# 时的最佳实践表明,如果该类实现了 IDisposable 接口,您应该清理资源。
有两种方法可以处理 Timer:
using
清理特定范围时,使用该指令自动调用 Dispose 方法。这将避免额外的 try/catch 块和代码行来正确清理。微软说要处理 IDisposable 对象。
System.Timers.Timer 类支持异步事件处理程序以在所需的时间间隔触发事件。要定义异步事件处理程序,请async
在 Elapsed 事件处理程序的签名之前使用修饰符。
例子:
- using System;
- using System.Threading.Tasks;
-
- Task HandleTimerAsync()
- {
- Console.WriteLine("Interval Called");
- // Your async logic here.
- return Task.CompletedTask;
- }
-
-
- System.Timers.Timer timer = new (interval: 1000 );
- timer.Elapsed += async ( sender, e ) => await HandleTimerAsync();
- timer.Start();
-
- System.Console.WriteLine("Start");
- System.Threading.Thread.Sleep(5000);
请记住,异步回调必须返回一个任务。如果异步方法运行时间超过间隔时间,您可能会得到一些意想不到的结果。
→ 阅读更多:C# 异步与同步
在 .NET 中,有 4 种不同的计时器,具体取决于您希望使用它们的方式:
System.Windows.Forms.Timer 类专为丰富的客户端用户界面而设计。
程序员可以将其作为非可视控件拖到窗体中,并从“属性”窗口中调节行为。它将始终安全地从可以与用户界面交互的线程中触发事件。
System.Web.UI.Timer 可以以定义的时间间隔异步或同步执行网页回发。它是 ASP.NET 框架的一部分,因此我们只能在 ASP.NET Web 应用程序中使用它。
此计时器可用于在 ASP.NET 应用程序上创建实时信息显示。
System.Threading.Timer 提供了在后台线程上异步或同步安排单个回调的能力。
System.Threading.Timer 是线程安全的。
System.Timers.Timer 是在 C# 中实现计时器的最佳方式。
System.Timers.Timer 是 System.Threading.Timer 的包装器,对功能进行抽象和分层。
您不能将 System.Threading.Timer 用作组件容器中的组件,它实现了 System.ComponentModel.IContainer,因为它不是从 System.ComponentModel.Component 派生的。
System.Timers.Timer 扩展了 System.Timers.Timer 的功能以包含组件容器应用程序所需的功能。
System.Timers.Timer 和 System.Threading.Timer 都是为在服务器类型的进程中使用而设计的,但是 System.Timers.Timer 包含一个同步对象以允许它与用户界面交互,这对于需要跟踪用户输入或更新。
请遵循以下准则来选择要使用的一个:
C# 计时器不准确。根据劳伦斯科技大学的研究,计时器平均比预期时间长 9.07% 。
要获得准确的时间,我们需要使用 .NET StopWatch 类。
秒表类用于计时代码执行。它可以启动、停止/暂停和重置。
C# Stopwatch 和 C# Timers 之间的主要区别在于,当 Timer 在特定时间间隔过去时触发事件,而 Stopwatch 计算自开始以来经过了多少时间。此外,秒表更准确,可以更精确地测量时间。
如果您想要高分辨率计时器,请考虑使用秒表而不是计时器。
秒表实现源代码。
EventHandler 和 ElapsedEventHandler 之间的主要区别在于 EventHandler 更通用,而 ElapsedEventHandler 使用具有特定签名的委托。
ElapsedEventHandler 是传递 ElapsedEventArgs 的委托,它通过添加FileTime
和扩展 EventHandler 的参数SignalTime
。添加的逻辑使 ElapsedEventHandler 委托与 ElapsedEventArgs 兼容。
ElapsedEventArgs 实现源代码。
C# 中的事件是类让客户知道对象何时发生有趣事件的一种方式。我们使用委托声明事件。
术语订阅和取消订阅有时用于表示某个类对特定事件感兴趣并想知道它何时发生。
我们通常不需要事件参数,因此我们可以将其作为事件处理程序中的可选参数来实现。
命名约定建议用过去时命名事件。例如,OrderPlaced、OrderShipped 等。
该约定还建议将事件处理程序命名为事件名称和后缀的组合EventHandler
。对于上述事件,事件处理程序将命名为OrderPlacedEventHandler
, OrderShippedEventHandler
。
计时器是在 C# 中处理基于时间的操作的好方法。它们可用于从 UI 编程到游戏逻辑等所有方面。
计时器类易于使用,并且可以轻松设置将在特定时间间隔发生的事件。
为了在 C# 中使用计时器,您必须首先使用所需的时间间隔设置计时器,然后定义 Elapsed 事件处理程序。计时器启动后,每次经过指定的时间间隔时都会调用事件处理程序。
如果您需要高分辨率计时器,请考虑使用 Stopwatch 类。使用完计时器后,请确保通过调用 Dispose() 方法正确处理它。
.NET 提供了多种计时器来满足您的需要,具体取决于您希望如何使用它们。System.Windows.Forms.Timer 专为丰富的客户端用户界面而设计,可以在“属性”窗口中进行调节。System.Web.UI.Timer 可用于 ASP.NET Web 应用程序以创建实时信息显示,而 System.Threading.Timer 非常适合线程池上的后台任务。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。