C#计时器与服务中的线程

C#计时器与服务中的线程,c#,multithreading,timer,C#,Multithreading,Timer,我有一个服务,每10秒访问一次数据库,如果有数据,就会获取数据。问题是处理这些数据可能需要30秒。如果我使用10秒间隔的计时器,服务将获得相同的数据两次 我试图达到的效果(只是为了可视化): Ppl说线程。睡眠在生产服务中是一个坏主意,我该如何使用计时器呢 /mike您是否尝试将计时器属性自动重置设置为false,并在刷新数据的过程结束时再次启用计时器 using System; public class PortChat { public static System.Timers.T

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

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

Ppl说线程。睡眠在生产服务中是一个坏主意,我该如何使用计时器呢


/mike

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

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


如果你需要每X秒做一件事,定时器是最好的选择。另一方面,如果您想暂停X秒,那么Thread.Sleep是合适的。

我看不出使用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

    }
}

Thread.Sleep
在服务中本身并不坏,只是您需要对服务命令做出响应,因此您的工作线程不应该在一个小时内进入睡眠状态,而是需要短时间睡眠,然后在服务的服务控制器部分出于某种原因告诉它停止时醒来并聆听


您希望这样做,如果管理员告诉您的服务停止,它将足够快地停止,这样它就不会收到任何超时消息,管理员无法确保您的服务停止,也无法安全地重新启动机器或类似的东西。

他们是否也在说为什么线程。睡眠是个坏主意?这正是我所寻找的。谢谢!很抱歉,在经过的事件中,它不应该是_timer.Enabled=false吗?如果它在main中完成了,为什么会再次设置为true?@Neale,最初的问题是暂停循环,直到某些事情没有完成。当我们设置_timer.Autoreset=false时,启用计时器后循环只会发生一次。所以,当循环以读取结束时,我们将通过启用itA再次激活计时器。休眠线程可能不会消耗任何cpu周期,但与计时器对象相比,它将消耗许多内核资源
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

    }
}