C# 网络编程 进程管理

概念

进程是对一段静态指令序列(程序)的动态执行过程。与进程相关的信息包括进程的用户标志、正在执行的已经编译好的程序、进程程序、数据在存储器中的位置等。
在System.Diagnostics命名空间下,有一个Process类,用于完成与进程相关的处理任务。
一个应用程序执行时调用其他的应用程序,实际上就是对进程进行管理。

获取进程信息

(1) 获取本地计算机所有进程

	Process[] myProcesses = Process.GetProcesses();

(2)获取本地计算机上指定名称的进程。

	Process[] myProcesses =Process.GetProcessesByName("进程名称");
    注意:(a)进程名称不带扩展名。
         (b)可以是任何一个可执行文件

(3)获取远程计算机的所有进程。

	Process[] myProcesses =Process.GetProcesses (remoteMachineName);
   例如:
    Process[] myProcesses =Process.GetProcesses ("192.168.0.1");

(4)获取远程计算机上指定名称的进程。

 Process[] myProcesses = Process.GetProcessesByName("远程进程名称",remoteMachineName);

显示本机所有进程信息

		private void GetAllProcess()
		{
		    dataGridView1.Rows.Clear();
		    myProcess = Process.GetProcesses();
		    foreach (Process p in myProcess)
		    {
		        int newRowIndex = dataGridView1.Rows.Add();
		        DataGridViewRow row = dataGridView1.Rows[newRowIndex];
		        row.Cells[0].Value = p.Id;
		        row.Cells[1].Value = p.ProcessName;
		        row.Cells[2].Value = string.Format("{0:###,##0.00}MB", p.WorkingSet64 / 1024.0f / 1024.0f);
		        //有些进程无法获取启动时间和文件名信息,所以要用try/catch
		        try
		        {
		            row.Cells[3].Value = string.Format("{0}", p.StartTime);
		            row.Cells[4].Value = p.MainModule.FileName;
		        }
		        catch
		        {
		            row.Cells[3].Value = "";
		            row.Cells[4].Value = "";
		        }
		    }
		} 
		private void ShowProcessInfo(Process p)
		{
		    StringBuilder sb = new StringBuilder();
		    sb.AppendLine("进程名称:" + p.ProcessName + ",  ID:" + p.Id);
		    try
		    {
		        sb.AppendLine("进程优先级:" + p.BasePriority + "(优先级类别: " + p.PriorityClass + ")");
		        ProcessModule m = p.MainModule;
		        sb.AppendLine("文件名:" + m.FileName);
		        sb.AppendLine("版本:" + m.FileVersionInfo.FileVersion);
		        sb.AppendLine("描述:" + m.FileVersionInfo.FileDescription);
		        sb.AppendLine("语言:" + m.FileVersionInfo.Language);
		        sb.AppendLine("------------------------");
		        if (p.Modules != null)
		        {
		            ProcessModuleCollection pmc = p.Modules;
		            sb.AppendLine("调用的模块(.dll):");
		            for (int i = 1; i < pmc.Count; i++)
		            {
		                sb.AppendLine(
		                    "模块名:" + pmc[i].ModuleName + "\t" +
		                    "版本:" + pmc[i].FileVersionInfo.FileVersion + "\t" +
		                    "描述:" + pmc[i].FileVersionInfo.FileDescription);
		            }
		        }
		    }
		    catch
		    {
		        sb.AppendLine("其他信息:无法获取");
		    }
		    this.richTextBox1.Text = sb.ToString();
		}

启动和停止进程

1. 启动进程:
(1)创建一个Process组件的实例,例如:
Process myProcess = new Process();

(2)设置其对应的StartInfo属性,指定要运行的应用程序名以及传递的参数:
myProcess.StartInfo.FileName = “文件名”;
process1.StartInfo.Arguments = “参数”;

也可以初始化ProcessStartInfo类的新实例,并指定启动进程时使用的诸如应用程序或文档 的文件名,然后将Process组件的StartInfo属性设置为该ProcessStartInfo的实例。例如;

ProcessstartInfo ps=new ProcessstartInfo (“Notepad”);//准备执行Notepad.exe
myProcess.startInfo=ps;
如果该进程带有图形用户界面,也可以指定图形用户界面的打开方式。例如:
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;

(3)调用该实例的Start方法启动该进程。
2. 停止进程
通过两种方法利用Process组件停止进程。
(1)如果进程有图形用户界面,调用CloseMainWindow方法。
(2)如果进程没有用户界面,调用进程的Kill方法。

不论有没有图形用户界面,如果希望强行让其退出,在权限允许的情况下,均可以调用Kill方法终止该进程。

		private void buttonStart_Click(object sender, EventArgs e)
        {
            string argument = Application.StartupPath + "\\myfile" + fileIndex + ".txt";
            if (File.Exists(argument)==false)
            {
                File.CreateText(argument);
            }
            //设置要启动的应用程序名称及参数
            ProcessStartInfo ps = new ProcessStartInfo(fileName, argument);
            ps.WindowStyle = ProcessWindowStyle.Normal;
            fileIndex++;
            Process p = new Process();
            p.StartInfo = ps;
            p.Start();
            //等待启动完成,否则获取进程信息可能会失败
            p.WaitForInputIdle();
            RefreshListView();
        }

        private void buttonStop_Click(object sender, EventArgs e)
        {
            this.Cursor = Cursors.WaitCursor;
            //创建新的Process组件的数组,并将它们与指定的进程名称(Notepad)的所有进程资源相关联.
            Process[] myprocesses;
            myprocesses = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(fileName));
            foreach (Process p in myprocesses)
            {
                //通过向进程主窗口发送关闭消息达到关闭进程的目的
                p.CloseMainWindow();
                //等待1000毫秒
                Thread.Sleep(1000);
                //释放与此组件关联的所有资源
                p.Close();
            }
            fileIndex = 0;
            RefreshListView();
            this.Cursor = Cursors.Default;
        }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值