我在服务中使用过Sytem.Timers.Timer,但它总是关闭,我不知道why?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的日志信息。请帮助我。
发布于 2016-06-13 14:19:40
System.Timer.Timers将使用您不处理的任何抛出的异常。这意味着计时器可能看起来像在运行,但每次触发事件时都会失败。
因此,您需要在其中有一个try/catch块来查看哪里出了问题。我强烈建议您始终在线程方法中使用try/catch (无论它是显式线程还是通过计时器调用)
发布于 2016-06-13 14:25:53
这似乎是一个已知的问题。
在Timer对象的经过事件的事件处理程序中,如果调用Timer对象的
方法,则会丢失对Timer对象的引用。然后,垃圾回收器回收与Timer对象关联的内存。以后,即使您调用Timer对象的Start方法来引发经过的事件,该调用也不起作用。不会引发Elapsed事件。
作为解决方法,建议使用System.Threading.Timer对象而不是System.Timers.Timer对象。
另一个参考(SO链接)- Windows Service System.Timers.Timer not firing
发布于 2016-08-22 20:19:58
我通过使用System.Threading.Timer.Thanks all来解决这个问题。
https://stackoverflow.com/questions/37782824
复制相似问题