进程 | Personal Blog

进程

线程与进程

进程是资源调度和分配的基本单位 线程是程序执行的最小单位 相对于进程,线程的切换代价较小,于是可以在一个进程中同时运行多个线程 进程之间相互独立,同一进程下的各个线程之间共享程序的内存空间和其他资源 主线程可以调用CPU,而进程没有这样的权限

前台线程运行完毕后,进程就终止了

C#中的相关类

System.Environment类中的ProceddorCount方法获取本机可用逻辑内核的数量

using System.Diagnostics;
//...
Process p = new Process();//创建Process组件的实例
p.StartInfo.FileName="文件名(notepad)";//启动指定程序名//首先在当前目录下寻找满足参数的程序,然后是在PATH路径下的程序//如果程序不在以上目录,则必须使用@+绝对路径
p.StartInfo.Arguments="参数(1.txt)";
p.Start();//启动线程

Process[] p1 =Process.GetProcesses();//获取本地计算机的所有进程
Process[] p2 =Process.GetProcessesByName("进程名");//获取指定的进程

任务管理器实例

using System;
using System.Collections.Generic;
using System.Diagnostics;//提供Process类
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace _20200309
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        int fileIndex = 1;
        string fileName = "Notepad";
        List<Data> list = new List<Data>();//泛型列表//Data是一个类
        public MainWindow()
        {
            InitializeComponent();
        }
        private void RefreshProcessInfo()//刷新
        {
            dataGrid1.ItemsSource = null;
            list.Clear();//清空
            Process[] processes = Process.GetProcesses();//获取所有进程
            // Process[] processes = Process.GetProcessesByName(fileName);
            // string FileName = "";
            foreach (Process p in processes)
            {
                Data data = new Data();//构造Data类对象
                data.Id = p.Id;
                data.ProcessName = p.ProcessName;
                try
                {
                    data.FileName = p.MainModule.FileName;
                }
                catch (Exception)
                {
                    data.FileName = "";//异常处理
                }
                list.Add(data);
            }
            dataGrid1.ItemsSource = list;
        }
        private void StartBtn_Click(object sender, RoutedEventArgs e)
        {
            string argument = Environment.CurrentDirectory + "\\myfile" + (fileIndex++) + ".txt";
            if (File.Exists(argument) == false)
            {
                File.CreateText(argument);//创建一个文本文档
            }
            Process p = new Process();
            p.StartInfo.FileName = fileName;
            p.StartInfo.Arguments = argument;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
            p.Start();
            p.WaitForInputIdle();
            RefreshProcessInfo();
        }
        private void StopBtn_Click(object sender, RoutedEventArgs e)
        {
            var a = dataGrid1.SelectedItem;
            Data selectItem = a as Data;
            Process p = Process.GetProcessById(selectItem.Id);
            try
            {
                p.Kill();
            }
            catch(Exception)
            {
                throw;
            }
            RefreshProcessInfo();
        }
    }
    public class Data
    {
        public int Id { get; set; }
        public string ProcessName { get; set; }
        public string TotalMemory { get; set; }
        public string StartTime { get; set; }
        public string FileName { get; set; }
    }
}

多线程解析IP地址实例

using System;
using System.Net;
using System.Threading;//关键命名空间

namespace _20200310
{
    class Program
    {
        static void Main(string[] args)
        {
            String strSub = "192.168.1.";
            String strIP = "";
            for (int i = 1; i < 10; i++)
            {
                strIP = strSub + i.ToString();
                Thread t1 = new Thread(GetOneIPHost);//为每个IP地址的解析创建一个辅助线程
                t1.Start(strIP);//在此处传递参数
                //GetOneIPHost(strIP);
            }
            // Thread t1 = new Thread(Method1);
            // t1.Name = "辅助线程1";
            // t1.IsBackground = true;//t1是后台线程
            // t1.Start();//此时线程t1处于就绪状态,可以参与CPU的调度和分配
            //           // Console.WriteLine("Hello World!");
            // Thread t2 = new Thread(Method2);
            // t2.Name = "辅助线程2";
            // t2.Start();
            //// Method1();//创建辅助线程
           // Thread t = new Thread(GetHost);
        }
        public static void GetOneIPHost(object strIP)//含参的线程方法需要使用object类型,且参数只能有一个
        {
            String myIp = strIP.ToString();
            try
            {
                Console.WriteLine(strIP + ":" + Dns.GetHostEntry(strIP.ToString()).HostName);
            }
            catch (Exception)
            {
                Console.WriteLine(strIP + ":wrong!");
            }
        }
        public static void Method1()//线程1
        {
            for(int i = 1;i<101;i++)
            {
                Thread.Sleep(1000);//休眠一秒
                Console.WriteLine("i:" + i);
            }
        }
        public static void Method2()//线程2
        {
            for (int i = 1; i < 101; i++)
            {
                Thread.Sleep(1000);//休眠一秒
                Console.WriteLine("j:" + i);
            }
        }
    }
}

高级语言在处理时,不是原子的,为了保证一条语句在一个时间片完整地完成,使用lock语句进行锁定。

private static object s =new object() //一个私有类型的对象
lock(obj)//锁定一个私有对象
{
    //需要处理的被保护的代码
}