服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#实现Windows服务测试与调试

C#实现Windows服务测试与调试

2023-02-14 15:18.NET开发菜鸟 C#

这篇文章介绍了C#实现Windows服务测试与调试的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、测试Windows服务

为了使Windows服务程序能够正常运行,我们需要像创建一般应用程序那样为它创建一个程序的入口点。像其他应用程序一样,Windows服务也是在Program.cs的Main()函数中完成这个操作。首先我们在Main()函数中创建一个Windows服务的实例,该实例应该是ServiceBase类的某个子类的对象,然后我们调用由基类ServiceBase类定义的一个Run()方法。然而调用Run()方法并不意味着就开始了Windows服务程序,必须要等到该对象的OnStart()方法被调用时服务才算真正开始运行。如果你想在一个Windows服务程序中同时启动多个服务,那么只要在Main()函数中定义多个ServiceBase类的子类的实例对象就可以了,方法就是创建一个ServiceBase类的数组对象。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
namespace WindowsServiceDemo
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {
                //服务1
                new MyService(),
                //服务2
                new Service1()
            };
            ServiceBase.Run(ServicesToRun);
        }
    }
}

由于Windows服务没有直接的用户交互,服务的状态必须通过记录日志才可知晓。要测试windows服务,可以通过重写服务里面的方法,在方法里面记录日志来实现。

1、新建Common类,类里面有一个WriteLog记录日志的方法。日志路径写在配置文件里面,可以实现项目的灵活性。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace WindowsServiceDemo
{
    public class Common
    {
        /// <summary>
        /// 记录日志
        /// </summary>
        /// <param name="strInfo"></param>
        public static void WriteLog(string strInfo)
        {
            string strPath=ConfigurationManager.AppSettings["FilePath"];
            using (StreamWriter sw = new StreamWriter(strPath, true))
            {
                sw.WriteLine(strInfo + ",当前时间:" + DateTime.Now.ToString());
                sw.Close();
            }
            
        }
    }
}

2、在Service1的设计界面点右键-->查看代码,打开Service1的代码,分别重写OnStart()、OnStop()、OnPause()、OnContinue()方法,在方法里面调用Common类的WriteLog方法来记录服务的运行状态。

?
1
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
namespace WindowsServiceDemo
{
    public partial class MyService : ServiceBase
    {
        public MyService()
        {
            InitializeComponent();
        }
 
        /// <summary>
        /// 服务启动时执行的代码
        /// </summary>
        /// <param name="args"></param>
        protected override void OnStart(string[] args)
        {
            try
            {
                Common.WriteLog("服务启动");
            }
            catch (Exception ex)
            {
                Common.WriteLog("服务启动出错:"+ex.Message);
            }
        }
 
        /// <summary>
        /// 服务停止时执行的代码
        /// </summary>
        protected override void OnStop()
        {
            try
            {
                Common.WriteLog("服务停止");
            }
            catch (Exception ex)
            {
                
                Common.WriteLog("服务停止出错:"+ex.Message);
            }
        }
 
        /// <summary>
        /// 服务暂停时执行的代码
        /// </summary>
        protected override void OnPause()
        {
            try
            {
                Common.WriteLog("服务暂停");
            }
            catch (Exception ex)
            {
                
                 Common.WriteLog("服务暂停出错:"+ex.Message);
            }
        }
 
        /// <summary>
        /// 服务恢复时执行的代码
        /// </summary>
        protected override void OnContinue()
        {
            try
            {
                Common.WriteLog("服务恢复");
            }
            catch (Exception ex)
            {
                
                 Common.WriteLog("服务恢复出错:"+ex.Message);
            }
        }
 
    }
}

3、在服务控制管理器里面分别启动、暂停、恢复、停止服务,查看生成的日志:

C#实现Windows服务测试与调试

日志里面正确记录了服务的运行状态,证明服务没有问题。

二、调试Windows服务

 调试Windows服务,可以采用将服务附加到进程的方法。

1、在菜单栏选项里面选择调试-->附加到进程

C#实现Windows服务测试与调试

2、在附加到进程界面,选择相应的服务进程,点击附加。

注意:要把服务附加到进程,必须保证服务是启动状态,否则在进程里面看不到服务的进程。

三、总结:

  • 1、Windows服务调试不能直接F5,可以通过附加到进程方式调试(调试前提:将服务启动、以管理员身份运行VS)
  • 2、Windows服务由于没有直接的用户交互,服务的状态必须通过日志才可知晓,恰当的加入try catch
  • 3、所有可能发生变化的内容都不要写死,尽量通过配置文件来实现,这是项目灵活性的重要指标
  • 4、Windows服务多用于定时操作、大数据量操作、监控操作等方面

到此这篇关于C#实现Windows服务测试与调试的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/dotnet261010/p/6180801.html

延伸 · 阅读

精彩推荐
  • C#Unity实现俄罗斯方块(一)

    Unity实现俄罗斯方块(一)

    这篇文章主要介绍了Unity实现俄罗斯方块的第一部分代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    阿浪啊8822022-09-16
  • C#unity实现玻璃效果

    unity实现玻璃效果

    这篇文章主要为大家详细介绍了unity实现玻璃效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    神码编程11482022-09-06
  • C#C#程序启动项的设置方法

    C#程序启动项的设置方法

    这篇文章主要为大家详细介绍了C#程序启动项的设置方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    唐宋元明清21886712022-03-05
  • C#c# 预处理识别硬币的数据集

    c# 预处理识别硬币的数据集

    这篇文章主要介绍了c# 预处理识别硬币的数据集的方法,帮助大家更好的利用c#进行深度学习,感兴趣的朋友可以了解下...

    码农译站11502022-10-25
  • C#Unity通过代码修改按钮点击效果

    Unity通过代码修改按钮点击效果

    这篇文章主要为大家详细介绍了Unity通过代码修改按钮点击效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    柚子味的小柠檬11272022-11-15
  • C#C# 实现TXT文档转Table的示例代码

    C# 实现TXT文档转Table的示例代码

    这篇文章主要介绍了C# 实现TXT文档转Table的示例代码,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...

    農碼一生7042022-10-21
  • C#c# 使用HtmlAgilityPack解析Html

    c# 使用HtmlAgilityPack解析Html

    这篇文章主要介绍了c# 如何使用HtmlAgilityPack解析Html,帮助大家利用c#进行爬虫,感兴趣的朋友可以了解下...

    傅小灰11662022-10-24
  • C#C#正则表达式Regex类的常用匹配

    C#正则表达式Regex类的常用匹配

    本文通过几个具体的实例,给大家详细介绍了C#中的正则表达式Regex类的实用方法,非常的细致,有需要的小伙伴可以参考下...

    C#教程网12162021-11-05