1、Timer控件失效的解决
在Windows 服务不引发计时器事件
原因:
我认为windows服务里不能使用System.Windows.Forms的Timer控件,Windows.Forms 计时器组件用于 Windows.Forms 环境。 WindowsForms 计时器组件不用于服务器环境,所以要使用System.Timer下的控件。
解决方案
这个可以通过修改控件的类型,把所有使用服务器计时器从命名空间 System.Timers 代替 System.Windows.Forms 计时器。注意System.Timers的事件是Elapsed事件
如:
Service1.Designer.cs
1
namespace MyNewService
2
{
3
partial class MyNewService
4
{
5
/// <summary>
6
/// 必需的设计器变量。
7
/// </summary>
8
private System.ComponentModel.IContainer components = null;
9
10
/// <summary>
11
/// 清理所有正在使用的资源。
12
/// </summary>
13
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
14
protected override void Dispose(bool disposing)
15
{
16
if (disposing && (components != null))
17
{
18
components.Dispose();
19
}
20
base.Dispose(disposing);
21
}
22
23
组件设计器生成的代码
52
53
private System.Diagnostics.EventLog eventLog1;
54
private System.Timers.Timer timer1;
55
56
}
57
}
Service1.cs:
namespace MyNewService2
{3
partial class MyNewService4
{5
/// <summary> 6
/// 必需的设计器变量。7
/// </summary>8
private System.ComponentModel.IContainer components = null;9

10
/// <summary>11
/// 清理所有正在使用的资源。12
/// </summary>13
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>14
protected override void Dispose(bool disposing)15
{16
if (disposing && (components != null))17
{18
components.Dispose();19
}20
base.Dispose(disposing);21
}22

23
组件设计器生成的代码52

53
private System.Diagnostics.EventLog eventLog1;54
private System.Timers.Timer timer1;55
56
}57
} 1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Diagnostics;
6
using System.ServiceProcess;
7
using System.Text;
8
9
namespace MyNewService
10
{
11
public partial class MyNewService : ServiceBase
12
{
13
public MyNewService()
14
{
15
InitializeComponent();
16
if (!System.Diagnostics.EventLog.SourceExists("MySource"))
17
{
18
System.Diagnostics.EventLog.CreateEventSource(
19
"MySource", "MyNewLog");
20
}
21
eventLog1.Source = "MySource";
22
eventLog1.Log = "MyNewLog";
23
}
24
25
protected override void OnStart(string[] args)
26
{
27
eventLog1.WriteEntry("In OnStart");
28
this.timer1.Enabled = true;
29
30
31
}
32
33
protected override void OnStop()
34
{
35
eventLog1.WriteEntry("In onStop.");
36
this.timer1.Enabled = false;
37
}
38
39
protected override void OnContinue()
40
{
41
eventLog1.WriteEntry("In OnContinue.");
42
}
43
44
45
46
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
47
{
48
eventLog1.WriteEntry("timer1_Tick." + DateTime.Now.ToString());
49
}
50
51
52
}
53
}
54
using System;2
using System.Collections.Generic;3
using System.ComponentModel;4
using System.Data;5
using System.Diagnostics;6
using System.ServiceProcess;7
using System.Text;8

9
namespace MyNewService10
{11
public partial class MyNewService : ServiceBase12
{13
public MyNewService()14
{15
InitializeComponent();16
if (!System.Diagnostics.EventLog.SourceExists("MySource"))17
{18
System.Diagnostics.EventLog.CreateEventSource(19
"MySource", "MyNewLog");20
}21
eventLog1.Source = "MySource";22
eventLog1.Log = "MyNewLog";23
}24

25
protected override void OnStart(string[] args)26
{27
eventLog1.WriteEntry("In OnStart");28
this.timer1.Enabled = true;29
30

31
}32

33
protected override void OnStop()34
{35
eventLog1.WriteEntry("In onStop.");36
this.timer1.Enabled = false;37
}38

39
protected override void OnContinue()40
{41
eventLog1.WriteEntry("In OnContinue.");42
}43

44
45

46
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)47
{48
eventLog1.WriteEntry("timer1_Tick." + DateTime.Now.ToString());49
} 50

51

52
}53
}54


