c# - System.Timers.Timer 没有停止

标签 c# timer

我创建了一个System.Timers.Timer,但我对它还很陌生。所以我之前使用过 Windows 窗体计时器,现在我想将此计时器用于控制台应用程序。
我的问题是我的计时器在一次 OnTimeEvent() 之后没有停止,我不知道为什么。

class SortingSysFinal
{
    private static System.Timers.Timer aTimer;

    public static void Main(String[] args)
    {
        System.Timers.Timer aTimer = new System.Timers.Timer();
        aTimer.Elapsed += OnTimedEvent;
        aTimer.Interval = 1000;
        aTimer.Enabled = true;
            
        Console.Read();
    }   
        
    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}", e.SignalTime);
        aTimer.Stop();
    }
}

最佳答案

问题在于您的 Main 方法中的这一行:

System.Timers.Timer aTimer = new System.Timers.Timer();

您正在创建一个新的本地Timer对象,它不是类的aTimer静态成员。 OnTimedEvent 确实被调用,但在这一行:aTimer.Stop() 它试图使用 aTimer 静态成员,即 >null 由于缺少初始化(因此引发异常)。

要修复此问题,请将上面的行更改为:

aTimer = new System.Timers.Timer();

这将按照我相信您的意图初始化类的静态成员,并使处理程序能够停止计时器。

请注意System.Timers.Timer 不是线程安全的。 Elapsed 处理程序在单独的线程上调用(请参阅: documentation ),因此您需要使用锁来同步 calline Stop() ,甚至更好:使用System.Threading.Timer相反。

关于c# - System.Timers.Timer 没有停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74581664/

相关文章:

c# - 自定义搜索图像 child 安全

c++ - 在 C++ 中重复跟踪计时器

vb.net - 在VB Net中每秒更新文本 block 的文本

java - 打印定时线程

C# WPF 列表框聊天

java - 在 C# 中等效于 Java 的匿名类?

c# - LINQ -> XML 处理不存在的元素节点

c# - 当我们将屏幕分辨率从低到高更改时动态设置 WPF 窗口的位置

c# - Unity重复生成,未使用的生成位置,问题

java - 为什么我无法刷新ListWindow的内容