首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.Timers.Timer始终自动关闭

System.Timers.Timer始终自动关闭
EN

Stack Overflow用户
提问于 2016-06-13 14:08:45
回答 3查看 179关注 0票数 0

我在服务中使用过Sytem.Timers.Timer,但它总是关闭,我不知道why?please.flow是代码。

代码语言:javascript
复制
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会停止,我查看日志,

它就像

代码语言:javascript
复制
key:2 2016.06.13 10:12
key: 2 true : 2016.06.13 10:14

它看起来运行得很好,没有错误,但是下一步它没有这个MyTimer的日志信息。请帮助我。

EN

回答 3

Stack Overflow用户

发布于 2016-06-13 14:19:40

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-06-13 14:25:53

这似乎是一个已知的问题。

参考#MS KB Article

在Timer对象的经过事件的事件处理程序中,如果调用Timer对象的

方法,则会丢失对Timer对象的引用。然后,垃圾回收器回收与Timer对象关联的内存。以后,即使您调用Timer对象的Start方法来引发经过的事件,该调用也不起作用。不会引发Elapsed事件。

作为解决方法,建议使用System.Threading.Timer对象而不是System.Timers.Timer对象。

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

票数 0
EN

Stack Overflow用户

发布于 2016-08-22 20:19:58

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37782824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档