C# 控制台应用程序计时器问题

Posted

技术标签:

【中文标题】C# 控制台应用程序计时器问题【英文标题】:C# console application timer issue 【发布时间】:2012-06-03 18:30:33 【问题描述】:

我有一个由 Windows 服务调用的控制台应用程序。此控制台应用程序根据某些 App.config 文件条目创建 System.Timers.Timer 实例(我创建了一个自定义 App.config 部分,计时器实例的数量将与该部分中的元素相同)。控制台应用程序预计不会关闭 - 如果它因某种原因关闭,Windows 服务将再次调用它。

为了使控制台应用程序永远存在,我编写了一个无限循环作为控制台应用程序的最后一条语句。而 (1 == 1) 。

问题是,我看到控制台应用程序每 5 分钟终止一次。我不明白为什么会这样。

如果有更好的方法,请提出建议。

代码

static void Main(string[] args)

        Boolean _isNotRunning;
        using (Mutex _mutex = new Mutex(true, _mutexID, out _isNotRunning))
        
            if (_isNotRunning)
            
                new ProcessScheduler().InitializeTimers();                             
                while (1 == 1)                                                           
            
            else
              
                return;
            
        

公共类 ProcessScheduler

public void InitializeTimers()
    
        XYZConfigSection.XYZAppSection section =  (XYZConfigSection.XYZAppSection)ConfigurationManager.GetSection("XYZApp");        
        if (section != null)
        
            XYZComponentTimer XYZComponentTimer = null;
            for (int intCount = 0; intCount < section.XYZComponents.Count; intCount++)
            
                XYZComponentTimer = new XYZComponentTimer();
                XYZComponentTimer.ComponentId = section.XYZComponents[intCount].ComponentId;
                XYZComponentTimer.Interval = int.Parse(section.XYZComponents[intCount].Interval);
                XYZComponentTimer.Elapsed += new ElapsedEventHandler(XYZComponentTimer_Elapsed);
                XYZComponentTimer.Enabled = true;                    
            
        
    

public class XYZComponentTimer:Timer
        
    public string ComponentId  get; set; 
        

更新:

如代码中所述,每个实例的计时器间隔是根据相应元素的配置文件值设置的。现在,配置文件中有两个部分:一个有 15 秒的间隔,另一个是 10 秒。

【问题讨论】:

【参考方案1】:

让我猜一下:定时器间隔是 5 分钟,定时器崩溃导致进程退出。

为什么不记录任何崩溃或附加调试器?

【讨论】:

当我在连接了调试器的开发机器上运行应用程序时,我没有看到应用程序崩溃。该应用程序将永远运行,没有任何问题。只有当我把它放在远程计算机上时,我才会看到这个。 将 try-catch 放在任何地方,并将异常记录到文件 (File.AppendAllText)。你已经知道有一个错误。你需要开始做一些事情来找到它。盯着代码是无效的。【参考方案2】:

处理AppDomain.UnhandledException event 并记录异常。

【讨论】:

【参考方案3】:

由于某种奇怪的原因,Mutex 每 5 分钟被实例化一次,并将 _isNotRunning 设置为 true。这就是问题所在。

【讨论】:

以上是关于C# 控制台应用程序计时器问题的主要内容,如果未能解决你的问题,请参考以下文章

C# 制作足球游戏控制台应用程序

C#使用定时器控制程序

C# 中的线程。使用计时器、线程和调用 shell 同时输出所有内容

C#中的全局键钩

C#定时器怎么写?

C#多线程之线程池篇3