2010-12-07 36 views
-1

我有一个应用程序,我想间隔更新。我正在寻找可能的某种类型的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); 
       } 
      } 
     } 
    } 
+0

Web或Winforms?你不能使用定时器控制吗? – Shoban 2010-12-07 17:34:17

+0

你看过一些相关的[MSDN文档](http://msdn.microsoft.com/en-us/library/system.timers.timer%28v=VS.100%29.aspx)吗?在C#中还有[其他类型]定时器(http://social.msdn.microsoft.com/Search/en-us?query=timer)。 – eldarerathis 2010-12-07 17:34:26

回答

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); 
} 

UPDATE:针对您发布的代码,看来你只是想打电话_UpdatePortStatus更新端口状态定期(见上面更新的例子)。

您需要牢记的一点很重要,即Timer将在单独的线程上运行,并且如果它从最后一次完成运行之前又重新引发事件(如果超过间隔时间跑步。

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方法中。如果用户想要改变频率,那么你会破坏当前的定时器并用新频率初始化。

这一切说,我必须强调,这是最简单的实现,并可能不适合你的需求。