好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

.NET Framework 2.0高级编程学习笔记(三):进程与线程

.NET Framework 2.0高级编程学习笔记(三):进程与线程

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

复制代码


效果:

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

NET Framework

 

.NET Framework 2.0高级编程学习笔记(三):进程与线程

 

posted @  2012-03-15 19:34  ForEvErNoMe 阅读(564) |  评论 (4)   编辑

 

.NET Framework 2.0高级编程学习笔记(二):委托与事件

 

posted @  2012-02-21 22:04  ForEvErNoMe 阅读(1454) |  评论 (4)   编辑

 

.NET Framework 2.0高级编程学习笔记(一):类型,泛型,集合

 

posted @  2012-02-15 23:00  ForEvErNoMe 阅读(1306) |  评论 (3)   编辑


作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于.NET Framework 2.0高级编程学习笔记(三):进程与线程的详细内容...

  阅读:44次