博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 之【线程与进程】
阅读量:5020 次
发布时间:2019-06-12

本文共 2545 字,大约阅读时间需要 8 分钟。

1.  引言

先来个比喻手法:

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

这个例子容易理解多了吧?!下面马上来看些基本概念。仅为个人理解,轻描淡写。

2.  进程

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

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

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

 

在.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去异步调用。

解决方法:

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 = "软件工程"; } } }

效果:

 

最后总结:进程和线程的知识点不是简单一两句话就能说清楚,自己只是稍微有个大概了解,学习之路任重而道远。

转载于:https://www.cnblogs.com/aiqingqing/p/4574447.html

你可能感兴趣的文章
构造以及析构函数的调用
查看>>
去除底部“自豪地采用 WordPress”版权信息----最后附最新版的删除方法!!
查看>>
对文件下载的补充
查看>>
gradle项目中profile的实现
查看>>
winfrom中将panel另存为图片
查看>>
向服务器发送Post或Get请求(封装好的)
查看>>
Bugs -----The largest and most interesting kind of thing.
查看>>
获取验证码倒计时
查看>>
面向对象 -- 类--对象--属性--__init__方法 --绑定方法,---非绑定方法,---拓展 # 20...
查看>>
根据浏览器窗口大小而变化
查看>>
买了将近20天的东西,还没到我手
查看>>
微信小程序---绘图
查看>>
实验四
查看>>
JDK JRE JVM
查看>>
排球计分程序
查看>>
基于twitter bootstrap的时间控件
查看>>
luoguP2048 超级钢琴
查看>>
二,常用类
查看>>
MD5 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)
查看>>
C函数tolower,与toupper
查看>>