2010-08-13 80 views
7

我有一个服务,每10秒点击一个数据库,并获取数据,如果有的话。处理这些数据最多可能需要30秒。如果我使用间隔10秒的定时器,服务将获得两次相同的数据。C#计时器与线程服务

的影响我正尝试实现(只是用于可视化):

while(true) 
{ 
    if(Getnrofrows() > 0) 
     do stuff 
    else 
     sleep for 10 sec 
} 

PPL说了Thread.Sleep是生产性服务业是一个坏主意,我怎么做这个用的计时器?

/麦克

+4

他们是否也在说*为什么* Thread.Sleep是一个坏主意? – Heinzi 2010-08-13 07:19:07

回答

10

你有没有尝试定时器属性自动复位设置为false,并重新启用定时器时刷新数据的过程结束

using System; 

public class PortChat 
{ 
    public static System.Timers.Timer _timer; 
    public static void Main() 
    { 

     _timer = new System.Timers.Timer(); 
     _timer.AutoReset = false; 
     _timer.Interval = 100; 
     _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed); 
     _timer.Enabled = true; 
     Console.ReadKey(); 
    } 

    static void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     //Do database refresh 
     _timer.Enabled = true; 
    } 
} 
+0

正是我在找的东西。谢谢! – 2010-08-13 08:53:48

+0

对不起,但不应该是_timer.Enabled = false在过去的事件?为什么如果它在主要完成,它又被设置为真? – Neale 2010-10-12 14:45:23

+0

@Neale,最初的问题是关于暂停循环,直到没有完成。当我们把_timer.Autoreset = false时,在启用定时器之后循环只会发生一次。因此,当我们的循环结束读取时,我们将通过启用它来再次激活定时器 – adopilot 2010-10-12 16:06:37

0

有没有错这种方法。睡眠线程不会消耗任何CPU周期。

如果您需要每X秒精确地做一些事情,则需要一个计时器。另一方面,如果您想暂停X秒,那么Thread.Sleep是适当的。

+0

睡眠线程可能不会消耗任何cpu周期,但与定时器对象相比,它将消耗大量内核资源 – Zuuum 2011-02-21 15:36:25

1

我看不出使用睡眠的任何问题,除非您最终可能会遇到难看的代码。

要回答你的问题:

public class MyTest 
{ 
    System.Threading.Timer _timer; 


    public MyTest() 
    { 
     _timer = new Timer(WorkMethod, 15000, 15000); 
    } 


    public void WorkMethod() 
    { 
     _timer.Change(Timeout.Infinite, Timeout.Infinite); // suspend timer 

     // do work 

     _timer.Change(15000, 15000); //resume 

    } 
} 
0

Thread.Sleep不坏本身就是一个服务,只是你需要响应服务命令,让你的工作线程不应该去睡一个小时,而是需要短时间睡眠,然后醒来并听取服务的服务控制器部分是否由于某种原因而告诉其停止。

你想要这样做,如果管理员告诉你的服务停止,它将停止足够快,以便它不会得到任何超时消息,管理员无法确定您的服务已停止,并且重启机器或类似设备是安全的。