简单

专注数据库技术,设计、应用、SQL技巧、各种优化方案探讨。
随笔 - 13, 文章 - 0, 评论 - 110, 引用 - 13
数据加载中……

将后台服务进程和窗口设置进程集成为一个程序

最近写了两个程序,都可以以服务进程和窗口进程两种方式运行,由于两类程序都需要入口程序,所以很简单,只要在入口方法代码中判断进入相应分支即可,下面总结一下开发心得。

第一个程序,窗口进程和服务进程的功能一样,都查询一些数据并发送Email。窗口程序需要从快捷方式加一个参M来运行(按第二个程序的方式可以不用参数判断)。代码如下:

 1    class Program
 2    {
 3        /// <summary>
 4        /// 应用程序的主入口点。
 5        /// </summary>

 6        [STAThread]
 7        static void Main(string[] args)
 8        {
 9
10            // 同一进程中可以运行多个用户服务。若要将
11            // 另一个服务添加到此进程中,请更改下行以
12            // 创建另一个服务对象。例如,
13            //
14            //   ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
15            //
16            if (args.Length > 0 && (args[0].ToUpper() == "/M" || args[0].ToUpper() == "-M"))
17            {
18                Application.EnableVisualStyles();
19                Application.SetCompatibleTextRenderingDefault(false);
20                Application.Run(new MainForm());
21            }

22            else
23            {
24                ServiceBase[] ServicesToRun;
25                ServicesToRun = new ServiceBase[] new Service1() };
26                ServiceBase.Run(ServicesToRun);
27            }

28        }

29
30
采用定时器时注意,窗口程序用System.Windows.Forms.Timer,而服务程序要用System.Threading.Timer。

第二个程序,窗口进程用于设置参数,保存于App.config,服务进程用于定时运行。代码如下:
 1    static class Program
 2    {
 3        /// <summary>
 4        /// 应用程序的主入口点。
 5        /// </summary>

 6        static void Main(string[] args)
 7        {
 8            bool b = false;
 9            System.ServiceProcess.ServiceController[] services;
10            services = System.ServiceProcess.ServiceController.GetServices();
11            for (int i = 0; i < services.Length; i++)
12            {
13                if (services[i].Status == System.ServiceProcess.ServiceControllerStatus.StartPending &&
14                    services[i].ServiceName == "Service2")
15                {
16                    b = true;
17                    break;
18                }

19            }

20            if (b)
21            {
22                ServiceBase[] ServicesToRun;
23                ServicesToRun = new ServiceBase[] new Service2() };
24                ServiceBase.Run(ServicesToRun);
25            }

26            else
27            {
28                Application.EnableVisualStyles();
29                Application.SetCompatibleTextRenderingDefault(false);
30                Application.Run(new Main());
31            }

32        }

33    }

34

将后台服务进程和窗口设置进程集成为一个程序,这种方案可以在程序中采用同一商业逻辑层代码,可以读取同一App.config设置,还可以在窗口进程中控制服务进程的启动和停止。采用入口方法进行分支,然后运行各自的代码,代码很简单,也很实用。

但还有以下两个问题,待高手指点。
1. App.config设置只在进程启动时读取一遍,更改的设置只有重启进程后才生效。
2. 服务需要用InstallUtil.exe来安装和卸载,如果能在窗口进程中安装和卸载就好了。

数据库技术就是一坛陈年老酒,越久越香,学以致用。

posted on 2006-10-10 10:48 简单 阅读(2255) 评论(7)  编辑 收藏 网摘 所属分类: .Net开发

评论

#1楼   回复  引用  查看    

服务程序可以作安装程序进行自动安装
2006-10-10 16:56 | 上善若水      

#2楼   回复  引用  查看    

给你的EXE增加让自身可以注册为windows 服务的功能.
/i 为安装/u为反安装


using System.Configuration.Install;

static void ConfigWindowsService(string[] args)
{
try
{
ManagedInstallerClass.InstallHelper(args);
}
catch (Exception exception1)
{
Console.WriteLine(exception1.Message);
}
}

//调用
if (param.Equals("/i", StringComparison.CurrentCultureIgnoreCase))
{
ConfigWindowsService(new string[] { "/i", Application.ExecutablePath });
return;
}
if (param.Equals("/u", StringComparison.CurrentCultureIgnoreCase))
{
ConfigWindowsService(new string[] { "/u", Application.ExecutablePath });
return;
}
2006-10-11 08:34 | 萧寒      

#3楼   回复  引用  查看    

以上代码就是可以不需要用InstallUtil.exe来安装和卸载windows services
2006-10-11 08:34 | 萧寒      

#4楼[楼主]   回复  引用  查看    

非常好,我测试可以很好使用。

另外,如果能将窗口进程和服务进程合并成一个进程就好了。而且要做到“两个进程”松散耦合,就是说可以单独关闭窗口,或者单独停止服务。好比将Sql Server2000的sqlmangr.exe和sqlservr.exe合并为一个程序,并且总是只启动一个进程。望高手出招。
2006-10-11 09:34 | 简单      

#5楼[楼主]   回复  引用  查看    

发现"卡巴斯基v6"的avp.exe进程就有我想要实现的功能:
1. 只有一个程序, 窗口进程用于设置,服务进程用于业务处理。
2. 窗口进程可以操作服务的启动和停止。
3. 可以分别启动或关闭窗口进程和服务进程。
但还有一点没有做到:
1. 仍然要运行两个avp.exe进程。
2006-10-12 12:24 | 简单      



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 524976




相关文章:

相关链接: