如何为应用添加计时器!

时间:2010-12-07 17:31:44

标签: c#

我有一个应用程序,我想在一段时间内更新。我正在寻找某种类型的if语句或try-catch语句。我已经在同一个班级有一个foreach声明,但我不认为我可以放在那里?我还想设置它,以便用户可以更改刷新率。任何帮助表示赞赏。感谢

这是我想把计时器放在......

的方法
private void _UpdatePortStatus(string[] files)
{

 foreach (string file in files)

            {
            PortStatus ps = new PortStatus();
            ps.ReadXml(new StreamReader(file));



            if (!_dicPortStatus.ContainsKey(ps.General[0].Group))
            {
                _dicPortStatus.Add(ps.General[0].Group, ps);
            }

            PortStatus psOrig = _dicPortStatus[ps.General[0].Group];

            foreach (PortStatus.PortstatusRow psr in ps.Portstatus.Rows)
            {
                DataRow[] drs = psOrig.Portstatus.Select("PortNumber = '" + psr.PortNumber + "'");

                if (drs.Length == 1)
                {
                    DateTime curDt = DateTime.Parse(drs[0]["LastUpdateDateTimeUTC"].ToString());
                    DateTime newDt = psr.LastUpdateDateTimeUTC;

                    if (newDt > curDt)
                    {
                        drs[0]["LastUpdateDateTimeUTC"] = newDt;
                    }
                }
                else if (drs.Length == 0)
                {
                    psOrig.Portstatus.ImportRow(psr);
                }
                else
                {
                    throw new Exception("More than one of the same portnumber on PortStatus file: " + file);
                }
            }
        }
    }

3 个答案:

答案 0 :(得分:4)

查看System.Timer课程。你基本上设置了一个间隔(例如10000毫秒),每当间隔时间过去它就会引发一个事件。

要允许使用更改刷新率,请编写一个接收用户输入并使用该方法更新TimerInterval的方法。请注意TimerInterval以毫秒为单位,因此您可能需要从用户输入的任何内容转换为该值。

因此,从示例中,事件将每10秒提升一次:

System.Timers.Timer aTimer = new System.Timers.Timer(10000); //10 seconds

// Hook up the Elapsed event for the timer.
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Enabled = true; // Starts the Timer

// Specify what you want to happen when the Elapsed event is raised
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    //Perform update
    _UpdatePortStatus(files);
}

更新:为了回应您发布的代码,您似乎只想调用_UpdatePortStatus定期更新端口状态(请参阅上面的更新示例)。

您需要记住的一个重点是,Timer将在一个单独的线程上运行,因此如果事件超过间隔时间,它可能会在上次运行完成之前再次引发事件。运行

答案 1 :(得分:1)

使用System.Timers.TimerSystem.Threading.TimerSystem.Windows.Forms.Timer ...取决于您“想要间隔更新的具体内容。”

请参阅以下文章:

http://www.intellitechture.com/System-Windows-Forms-Timer-vs-System-Threading-Timer-vs-System-Timers-Timer/

http://www.yoda.arachsys.com/csharp/threads/timers.shtml

答案 2 :(得分:0)

你的问题有些模糊,因为有许多不同的方法可以实现你想要做的事情。但是,在最简单的术语中,您需要创建一个System.Threading.Timer,它根据您定义的频率进行计算,例如:

private System.Threading.Timer myTimer;

private void StartTimer()
{
        myTimer = new System.Threading.Timer(TimerTick, null, 0, 5000);
}

private void TimerTick(object state)
{
    Console.WriteLine("Tick");
}

在此示例中,计时器将每5秒“勾选”一次并执行您在TimerTick方法中编码的任何功能。如果用户想要更改频率,那么您将销毁当前计时器并使用新频率进行初始化。

所有这些都说,我必须强调这是最简单的实施,可能不适合你的需要。