System.Timers.Timer始终自动关闭

时间:2016-06-13 06:08:45

标签: c# timer

我在服务中使用了Sytem.Timers.Timer,但总是关机,我不知道为什么?please.flow是代码。

public partial class Service1 : ServiceBase
{

    List<MyTimer> list = null;
    private string tbkqsj = "01:30";
    public Service1()
    {
        InitializeComponent();
        Init();
    }


    public void Init()
    {
        object o = System.Configuration.ConfigurationManager.AppSettings["Assmebles"];
        string[] assmebles = o.ToString().Split(',');
        list = new List<MyTimer>();
        MyTimer timer = null;
        tbkqsj = System.Configuration.ConfigurationManager.AppSettings["tbkqsj"];
        int flag = 1;
        foreach (var item in assmebles)
        {
            timer = new MyTimer()
            {

                Enabled = false,

                AutoReset = true,
                Interval = 1000 + flag * 100,

            };
            timer.key = item;
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            this.list.Add(timer);
            flag++;
        }

    }

    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {

        System.Configuration.ConfigurationManager.RefreshSection("appSettings");
        System.Configuration.ConfigurationManager.RefreshSection("connectionStrings");
        MyTimer timer = sender as MyTimer;
        timer.Enabled = false;
        synKqCard.writeMessage("key:"+timer.key+":" + DateTime.Now.ToString());
        try
        {
            if (timer.key == "1")
            {
                timer.Interval = Convert.ToDouble(System.Configuration.ConfigurationManager.AppSettings["ryInterval"].ToString());
                synUser.synUserData();
            }
            else if (timer.key == "3")
            {

                    timer.Interval = Convert.ToDouble(System.Configuration.ConfigurationManager.AppSettings["DptInterval"].ToString());

                    synDpt.synDptData();

            }
            else
            {
                string hhmm = System.DateTime.Now.ToString("HH:mm");
                if (tbkqsj == hhmm)
                {

                    timer.Interval = Convert.ToDouble(System.Configuration.ConfigurationManager.AppSettings["Interval"].ToString());
                    string SynTime = System.Configuration.ConfigurationManager.AppSettings["SynTime"].ToString();

                    synKqCard.synKqCardData();

                }
            }
        }
        catch (Exception ex)
        {
            synKqCard.writeMessage("timererror:" + ex);
            timer.Enabled = true;
        }
        timer.Enabled = true;
        synKqCard.writeMessage("key:" + timer.key + ":"+timer.Enabled+":" + DateTime.Now.ToString());
    }
    protected override void OnStart(string[] args)
    {

        synKqCard.writeMessage(DateTime.Now.ToString()+":start");
        foreach (var item in list)
        {
            item.Enabled = true;
            item.Start();
        }
    }

    protected override void OnStop()
    {

        synKqCard.writeMessage(DateTime.Now.ToString() + ":stop");
        foreach (var item in list)
        {
            item.Enabled = false;
            item.Stop();
        }
    }


}


public class MyTimer : System.Timers.Timer
{
    public string key { get; set; }
}

我已初始化了三个MyTimer,但有时会运行,一个MyTimer会停止,我会查看日志,

喜欢

key:2 2016.06.13 10:12
key: 2 true : 2016.06.13 10:14

它似乎运行良好而没有错误,但接下来它没有这个MyTimer的日志信息。请帮帮我。

3 个答案:

答案 0 :(得分:1)

System.Timer.Timers将使用您未处理的任何抛出异常。这意味着计时器看起来可能正在运行,但每次触发事件时都会失败。

因此你需要在其中有一个try / catch块来查看出错的地方。我强烈建议您始终在线程方法中使用try / catch(无论它是显式线程还是通过计时器调用)

答案 1 :(得分:0)

这似乎是一个已知问题。

参考#MS KB Article

  

在Timer对象的Elapsed事件的事件处理程序中,如果您   调用Timer对象的Stop方法,即对Timer的引用   对象丢失了。然后垃圾收集器回收内存   与Timer对象相关联。以后,即使你打电话给Start   Timer对象的方法提升Elapsed事件,调用确实如此   不行。 Elapsed事件未被提升。

建议使用System.Threading.Timer对象代替System.Timers.Timer对象。

另一个参考(SO Link) - Windows Service System.Timers.Timer not firing

答案 2 :(得分:0)

我使用System.Threading.Timer.Thanks all解决了这个问题。