【问题标题】:C# Timer vs Thread in ServiceC# 定时器与服务中的线程
【发布时间】:2010-08-13 07:17:13
【问题描述】:

我有一个服务,它每 10 秒访问一次数据库并获取数据(如果有)。问题是处理这些数据最多可能需要 30 秒。如果我使用间隔为 10 秒的计时器,该服务将获得两次相同的数据。

我想要达到的效果(只是为了可视化):

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

有人说 Thread.Sleep 在生产服务中是个坏主意,我该如何使用计时器来做到这一点?

/麦克

【问题讨论】:

  • 他们是否也在说为什么 Thread.Sleep 是个坏主意?

标签: c# multithreading timer


【解决方案1】:

您是否尝试将 Timer 属性自动重置为 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;
    }
}

【讨论】:

  • 正是我想要的。谢谢!
  • 对不起,在过去的事件中不应该是 _timer.Enabled = false 吗?如果它在 main 中完成,为什么它再次设置为 true?
  • @Neale,最初的问题是关于暂停循环,直到某些事情没有完成。当我们设置 _timer.Autoreset = false 时,启用定时器后循环只会发生一次。因此,当我们的循环以读取结束时,我们将通过启用它来再次激活计时器
【解决方案2】:

除了你可能会得到丑陋的代码之外,我认为使用 Sleep 没有任何问题。

回答你的问题:

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

    }
}

【讨论】:

    【解决方案3】:

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

    如果您需要每隔 X 秒执行一次操作,那么计时器就是您的最佳选择。另一方面,如果您想暂停 X 秒,那么 Thread.Sleep 是合适的。

    【讨论】:

    • 休眠线程可能不会消耗任何 cpu 周期,但与 Timer 对象相比,它会消耗许多内核资源
    【解决方案4】:

    Thread.Sleep 在服务中本身并不坏,只是你需要对服务命令做出响应,所以你的工作线程不应该休眠一个小时,而是需要休眠一小段时间并且然后唤醒并监听服务的服务控制器部分是否因为某种原因告诉它停止。

    您希望这样如果管理员告诉您的服务停止,它会足够快地停止,这样它就不会收到任何超时消息,管理员无法确定您的服务是否已停止并且它是安全重启机器或类似设备。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      相关资源
      最近更新 更多