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:
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

52

53

54

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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54
