我在服务中使用了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
的日志信息。请帮帮我。
答案 0 :(得分:1)
System.Timer.Timers
将使用您未处理的任何抛出异常。这意味着计时器看起来可能正在运行,但每次触发事件时都会失败。
因此你需要在其中有一个try / catch块来查看出错的地方。我强烈建议您始终在线程方法中使用try / catch(无论它是显式线程还是通过计时器调用)
答案 1 :(得分:0)
这似乎是一个已知问题。
在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解决了这个问题。