线程与进程
进程是资源调度和分配的基本单位 线程是程序执行的最小单位 相对于进程,线程的切换代价较小,于是可以在一个进程中同时运行多个线程 进程之间相互独立,同一进程下的各个线程之间共享程序的内存空间和其他资源 主线程可以调用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)//锁定一个私有对象
{
//需要处理的被保护的代码
}