随笔 - 87  文章 - 1  评论 - 610  阅读 - 44万

进程服务编写,与启动停止控制

进程编写很简单,可以创建,一个WINDOWS服务的项目就行,不过创建以后没有相关安装服务的配制,可以添加一个安装配制文件,
添加系统DLL引用,System.Configuration.Install
代码如下:

using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;

namespace TransferService
{
    
/// <summary>
    
/// ProjectInstaller 的摘要说明。
    
/// </summary>

    [RunInstaller(true)]
    
public class ProjectInstaller : System.Configuration.Install.Installer
    
{
        
private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1;
        
private System.ServiceProcess.ServiceInstaller serviceInstaller1;
        
/// <summary>
        
/// 必需的设计器变量。
        
/// </summary>

        private System.ComponentModel.Container components = null;

        
public ProjectInstaller()
        
{
            
// 该调用是设计器所必需的。
            InitializeComponent();

            
// TODO: 在 InitializeComponent 调用后添加任何初始化
        }


        
/// <summary> 
        
/// 清理所有正在使用的资源。
        
/// </summary>

        protected override void Dispose( bool disposing )
        
{
            
if( disposing )
            
{
                
if(components != null)
                
{
                    components.Dispose();
                }

            }

            
base.Dispose( disposing );
        }



        
组件设计器生成的代码
    }

}


主要服务运算代码可以在,  Service1.cs的static void Main()或构造函数里写,
如果要编写程序控制服务,.Net Framework有一个, System.ServiceProcess.ServiceController的类,可以控制服务器,起动与暂停,停止等,默认没有暂停功能,如果需要,在服务代码里,需要,OVer相应的代码,默认Onstart与OnStop已经Override,
System.ServiceProcess.ServiceController控制起来很简单,设置属性:MachineName(服务器名)与ServiceName(进程名)就可以获得进程的状态了和控制了,
这个的进程名是对应Install.cs里的, this.serviceInstaller1.ServiceName = "YJC.Transfer.Service";这个属性
不过要次控制需要使用,Refresh();方法进行刷新,
相应我的代码如下:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.ServiceProcess;
using KitDescriptor;
namespace ServiceManager
{
    
/// <summary>
    
/// Form1 的摘要说明。
    
/// </summary>

    [Kit("ServiceMange", DisplayName = "后台服务管理", PictureName = "WebCargoForm.gif", Author = "WangYJ"
         Description 
= "服务管理", DisplayOrder = 1)]
    
public class AppMainForm : FormSolution.Library.UI.EditForm
    
{
        
private System.Windows.Forms.ComboBox cb_Service;
        
/// <summary>
        
/// 必需的设计器变量。
        
/// </summary>

        private System.ComponentModel.Container components = null;
        
private FormSolution.Library.CustomControl.XPButton.XPButton btn_start;
        
private System.ServiceProcess.ServiceController fSericeControl;
        
private System.Windows.Forms.TextBox txt_MachineName;
        
private FormSolution.Library.CustomControl.XPButton.XPButton btn_Parse;
        
private FormSolution.Library.CustomControl.XPButton.XPButton btn_stop;
        
private FormSolution.Library.CustomControl.XPButton.XPButton btn_install;
        
private FormSolution.Library.CustomControl.XPButton.XPButton btn_uninstall;
        
private FormSolution.Library.CustomControl.XPButton.XPButton btn_refresh;
        
private System.Windows.Forms.Label label1;
        
private System.Windows.Forms.Label label2;
        
private System.Windows.Forms.GroupBox groupBox1;

        
private DataSet ds = null;
        
public AppMainForm()
        
{
            
//
            
// Windows 窗体设计器支持所必需的
            
//
            InitializeComponent();
            ds 
= new DataSet();
        
//    cb_Service.DataSource = ServiceManager.GetObject.Tables[0];
            string path = Application.StartupPath+"\\service.config";
            ds.ReadXml(path,XmlReadMode.ReadSchema);
            
            
//
            
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
            
//
            foreach(DataRow row in ds.Tables[0].Rows)
            
{
                cb_Service.Items.Add(row[
"DisplayName"]);
            }

            
            
        }


        
/// <summary>
        
/// 清理所有正在使用的资源。
        
/// </summary>

        protected override void Dispose( bool disposing )
        
{
            
if( disposing )
            
{
                
if (components != null
                
{
                    components.Dispose();
                }

            }

            
base.Dispose( disposing );
        }


        
Windows 窗体设计器生成的代码

        
/// <summary>
        
/// 应用程序的主入口点。
        
/// </summary>

        [STAThread]
        
static void Main() 
        
{
            Application.Run(
new AppMainForm());
        }


        
private void cb_Service_SelectedIndexChanged(object sender, System.EventArgs e)
        
{
            fSericeControl.MachineName 
= txt_MachineName.Text;
            fSericeControl.ServiceName 
= getRow()["ServiceName"].ToString();
            btn_refresh.Enabled 
= true;
            CheckStatus();
        }

        
public void CheckStatus()
        
{
            System.Threading.Thread.Sleep(
100);
            btn_start.Enabled 
= false;
            btn_stop.Enabled 
= false;
            btn_Parse.Enabled 
= false;
            btn_install.Enabled 
= false;
            btn_uninstall.Enabled 
= false;
            
try
            
{
                
if(fSericeControl.Status == System.ServiceProcess.ServiceControllerStatus.Stopped)
                
{
                    btn_start.Enabled 
= true;
                    btn_uninstall.Enabled 
= true;
                }

                
if(fSericeControl.CanPauseAndContinue)
                
{
                    btn_Parse.Enabled 
= true;
                }

                
if(fSericeControl.CanStop)
                
{
                    btn_stop.Enabled 
= true;
                }

            }

            
catch
            
{
                btn_install.Enabled 
= true;

            }


        }


        
private void btn_install_Click(object sender, System.EventArgs e)
        
{
            
try
            
{
                CommandControls.ExcuteCmd(getRow()[
"InstallPath"].ToString());
                System.Threading.Thread.Sleep(
1000);
                ShowMess(
"安装成功!");
            }

            
catch(Exception ex)
            
{
                ShowMess(ex.ToString());
            }

            
            CheckStatus();
        }


        
private void btn_Parse_Click(object sender, System.EventArgs e)
        
{
            
if(fSericeControl.Status == System.ServiceProcess.ServiceControllerStatus.Running)
            
{
                fSericeControl.Pause();
                btn_Parse.Text 
= "继续";
            }

            
else
            
{
                fSericeControl.Continue();
                btn_Parse.Text 
= "暂停";
            }

            CheckStatus();
        }


        
private void btn_stop_Click(object sender, System.EventArgs e)
        
{
            fSericeControl.Stop();
            fSericeControl.Refresh();
            CheckStatus();
        }


        
private void btn_start_Click(object sender, System.EventArgs e)
        
{
        
            fSericeControl.Start();
            fSericeControl.Refresh();
            CheckStatus();
                
        }


        
private void btn_refresh_Click(object sender, System.EventArgs e)
        
{
            fSericeControl.Refresh();
            CheckStatus();
        }


        
private void btn_uninstall_Click(object sender, System.EventArgs e)
        
{
            
try
            
{
                CommandControls.ExcuteCmd(getRow()[
"UninstallPath"].ToString());
                System.Threading.Thread.Sleep(
1000);
                ShowMess(
"卸载成功!");
            }

            
catch(Exception ex)
            
{
                ShowMess(ex.ToString());
            }

            
            CheckStatus();
        }

        
public DataRow getRow()
        
{
            
if(cb_Service.Text != "")
                
return ds.Tables[0].Rows[cb_Service.SelectedIndex];
            
else
                
return null;
        }

        
public void ShowMess(string msg)
        
{
            MessageBox.Show(msg);
        }


        
    }

}


posted on   edobnet  阅读(3062)  评论(3编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
< 2005年10月 >
25 26 27 28 29 30 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 1 2 3 4 5

点击右上角即可分享
微信分享提示