0
点赞
收藏
分享

微信扫一扫

c#学习笔记--


第八章:进程和线程

1:先来个比喻手法:

如果把上课的过程比作进程,那么每个学生就是一个线程,他们共享教室,即线程共享进程的内存空间。每一个时刻,只能一个学生问老师问题,老师回答完毕,轮到下一个。即线程在一个时间片内占有cpu。

2.  进程

进程是表示资源分配的基本单位,又是调度运行的基本单位。从编程的角度,也可以将进程看成一块包含了某些资源的内存区域。

例如:当用户打开一个txt文档时,系统就创建一个进程,并为它分配资源。有时候打开得很慢,这是因为此时CPU运行的进程数过多,该进程需要等待调度,才能真正运行。如果再打开另外一个txt文档时,此时在资源管理器中会发现有两个进程,所占的内存数不一样,是因为文档的大小不相同。

所以我的理解是,只要是打开应用程序,就会创建进程。

 


c#学习笔记--_C#学习笔记

在.NET框架在System.Diagnostics名称空间中,有一个类Process,可以用来创建一个新的进程。下面用代码来创建一个Hello.txt的记事本,运行代码后启动任务管理器,可以发现创建了一个记事本的进程。

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Threading;

namespace ProcessPgr
{
class Program
{
static void Main(string[] args)
{
Process process = Process.Start("notepad.exe", "Hello.txt");//创建Hello.txt的记事本
Thread.Sleep(1000);
Console.ReadLine();
process.Kill();
}
}
}

3.线程

线程是进程中执行运算的最小单位,也是执行处理机调度的基本单位。实际上线程是轻量级的进程。那么为什么要使用线程呢?


(1)易于调度。 (2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。 (3)开销少。创建线程比创建进程要快,所需开销很少。。 (4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。 进程和线程的关系 (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。 (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。 (3)处理机分给线程,即真正在处理机上运行的是线程。 (4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。


例如我们创建一个winform窗体时,创建一个线程,将内容赋值给文本框,点击获取数据。此时如果直接在委托方法里面操作会报异常,因为创建的线程不能访问UI控件,所以我们在获取数据的时候,通过Invoke或者BeginInvoke去异步调用。



c#学习笔记--_应用程序_02

解决方法:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Diagnostics;



namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}



private void listView1_SelectedIndexChanged(object sender, EventArgs e)

{



}



private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)

{



}



private void 创建进程ToolStripMenuItem_Click(object sender, EventArgs e)

{

OpenFileDialog ofDlg = new OpenFileDialog();

ofDlg.Filter = "All Executables(*.exe)|*.exe";

if (ofDlg.ShowDialog() == DialogResult.OK)

{

try

{

Process newProcess = Process.Start(ofDlg.FileName);

}

catch (Exception ex)

{

MessageBox.Show(ex.ToString());

}

}

}



private void 刷新列表ToolStripMenuItem_Click(object sender, EventArgs e)

{

string processName;

int processID;

int threadNumber;

TimeSpan cpuTime;

long processMemory;

listView1.Items.Clear();

Process[] processes = Process.GetProcesses();

try{

for(int i=0;i<processes.Length;i++)

{

processName=processes[i].ProcessName;

processID=processes[i].Id;

threadNumber=processes[i].Threads.Count;

cpuTime=processes[i].TotalProcessorTime;

processMemory=processes[i].WorkingSet64;

string[] subItems=

{

processName,processID.ToString(),threadNumber.ToString(),

string.Format("{0:00}:{1:00}:{2:00}",cpuTime.Hours,cpuTime.Minutes,cpuTime.Seconds),

string.Format("{0:#,#,#}K",processMemory/1024)

};

listView1.Items.Insert(i,new ListViewItem(subItems));

}

}

catch(Exception ex)

{

MessageBox.Show(ex.Message);

}

}



private void Form1_Load(object sender, EventArgs e)

{



}



private void 结束进程ToolStripMenuItem_Click(object sender, EventArgs e)

{

if (listView1.SelectedItems.Count > 0)

{

string str = listView1.SelectedItems[0].SubItems[1].Text;

int processID = Int32.Parse(str);

Process selectedProcess = Process.GetProcessById(processID);

selectedProcess.Kill();

}

}





}

}


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

Thread thread;
public delegate void MyInvoke();

private void btnSend_Click_1(object sender, EventArgs e)
{
labMessage.Text = "正在读取数据,请等待";
thread = new Thread(Send);
thread.IsBackground = true;
thread.Start();
}

protected void Send()
{
MyInvoke invoke = new MyInvoke(Get);
this.BeginInvoke(invoke);
}

protected void Get()
{
Thread.Sleep(3000);
txtName.Text = "TerryChan";
txtNum.Text = "07";
txtGrade.Text = "软件工程";
}
}
}



效果:


c#学习笔记--_应用程序_03

 

举报

相关推荐

C#学习笔记

C#学习笔记(三)

c#入门学习笔记

c# 学习笔记 - String

C#学习笔记_继承

C# Autofac学习笔记

C#学习笔记之继承

0 条评论