zoukankan      html  css  js  c++  java
  • C# 之【线程与进程】

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


    效果:

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

  • 相关阅读:
    Mybatis数据库操作的返回值
    Java中设置classpath、path、JAVA_HOME的作用?
    mysql备份与还原,增量备份;使用ibd和frm文件恢复数据
    SQLAlchemy会话与事务控制:互斥锁和共享锁
    log4j设置,以及中文乱码,通过过滤器输出指定级别的日志,或者指定级别范围的日志
    SQL重复记录查询-count与group by having结合查询重复记录
    css样式美化 下拉框 select 样式
    人人都是 DBA(XIII)索引信息收集脚本汇编
    java线程安全问题之静态变量、实例变量、局部变量
    java uuid第一次性能
  • 原文地址:https://www.cnblogs.com/aiqingqing/p/4574447.html
Copyright © 2011-2022 走看看