C#多线程案例基础

C#多线程案例基础(转)

在学习多线程之前,我们先来看几个概念:

1,什么是进程?
    当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源,当然一个程序也可能开启多个进程
   而一个进程又是由多个线程所组成的。

2.什么是线程?
   线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。

3,什么是多线程?
   多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
多线程的好处:
   可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率,当然也可以提升用户体验。多线程的      典型应用就是当从数据库中读取大量数据时,会造成界面假死,用户无法操作界面上的其他内容。而使用多线程就可以解决这个问题。
多线程的不利方面:
  线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
  多线程需要协调和管理,所以需要CPU时间跟踪线程;
  线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
  线程太多会导致控制太复杂,最终可能造成很多Bug;

注意:任何程序在执行时,至少有一个主线程。

一个程序从main开始之后,进程启动,为整个程序提供各种资源,而此时将启动一个线程,这个线程就是主线程,它将调度资源,进行具体的操作。Thread开启的线程是主线程下的子线程,是父子关系,此时该程序即为多线程的,这些线程共同进行资源的调度和执行。

Thread类有几个至关重要的方法,描述如下:
   Start():启动线程;
   Sleep(int):静态方法,暂停当前线程指定的毫秒数;
   Abort():通常使用该方法来终止一个线程;
   Suspend():该方法并不终止未完成的线程,它仅仅挂起线程,以后还可恢复;
   Resume():恢复被Suspend()方法挂起的线程的执行;

用通俗易懂的话来说,多线程可以让计算机"同时"做多件事情,节约时间。多线程可以让一个程序“同时”处理多个事情。

下面我们通过几个案例来进一步了解多线程

多线程的案例:

案例1:通过多线程执行一个方法

class Program

{

static void Main(string[] args)

{

MyClass myClass=new MyClass();

Thread thread=new Thread(new ThreadStart(myClass.MyThread1));

thread.Start();

Console.WriteLine(thread.ThreadState);

//注意这里用readline()不能用readkey否则不能出现效果

Console.ReadLine();

}

}

class MyClass

{

public void MyThread1()

{

Console.WriteLine("大家好,我是线程1");

}

}

解释下上述代码,首先在MyClass类中定义一个MyThread1方法,该方法无参数无返回值。然后在Main方法中,通过Thread类创建出一个Thread对象thread,但是其构造函数中需要传入一个委托变量,所以通过new ThreadStart(myClass.MyThread1)创建了一个委托变量,接下就可以通过thread.Start()启动线程,这里需要注意的是,调用thread的Start方法后,线程并不是马上执行,而仅仅是被标记为该线程可以执行了,至于线程何时执行,需要听从cpu的调度。

案例2:带参数的线程启动方法

static void Main(string[] args)

{

Thread thread=new Thread(new ParameterizedThreadStart(ParameterRun));

string[] strs = {"李小龙","巩俐","范冰冰"};

thread.Start(strs);

Console.ReadLine();

}

static void ParameterRun(object obj)

{

Console.WriteLine("我是带参数的线程方法");

string[] arr = obj as string[];

foreach (string s in arr)

{

Console.WriteLine(s);

}

}

这个案例和案例1的唯一区别是创建Thread实例时需要一个带参数的委托变量作为构造函数的参数,而且符合委托规范的方法必须没有返回值,且只能有一个参数,并且参数类型是object的。ParameterRun方法参数赋值时,需要在thread.Start()中进行。

当然,在真实的项目中,使用不可能这么简单,但是只要了解清楚了带参数线程的使用方式,再复杂的问题都会迎刃而解。

案例3:模拟摇奖机程序

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private Thread thread;

//摇奖机是否为启动状态

private bool isStart = false;

private void btnok_Click(object sender, EventArgs e)

{

if (isStart)

{

btnok.Text = "开始";

isStart = false;

}

else

{

btnok.Text = "停止";

isStart = true;

//单独开启一个线程摇号,避免主线程假死

thread = new Thread(Show);

thread.Start();

}

}

public void Show()

{

Random random=new Random();

while (isStart)

{

lbl1.Text = random.Next(0, 10).ToString();

lbl2.Text = random.Next(0, 10).ToString();

lbl3.Text = random.Next(0, 10).ToString();

//让当前线程睡一会儿

Thread.Sleep(100);

}

}

private void Form1_Load(object sender, EventArgs e)

{

//不检查控件的跨线程操作

Control.CheckForIllegalCrossThreadCalls = false;

}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

//在窗体关闭(主线程)前关闭子线程

if (thread!=null)

{

thread.Abort();

}

}

}

写该程序时,需注意几点:

1,         在窗体的Load事件中设置不检查控件的跨线程操作

2,         在主窗体关闭前,结束子线程的执行

3,         为了避免随机数生活速度过快,使用Thread.Sleep(),让生成随机数的线程休息一段时间

当然,我们讲解的只是多线程的使用方式,如果想要对多线程的底层实现有更深入的了解,还需查询更多书籍和资料。希望这篇文章能对您有所帮助。

时间: 2024-08-02 20:10:21

C#多线程案例基础的相关文章

多线程学习-基础(十二)生产者消费者模型:wait(),sleep(),notify()实现

一.多线程模型一:生产者消费者模型   (1)模型图:(从网上找的图,清晰明了) (2)生产者消费者模型原理说明: 这个模型核心是围绕着一个"仓库"的概念,生产者消费者都是围绕着:"仓库"来进行操作,一个仓库同时只能被一个生产者线程或一个消费者线程所操作,synchronized锁住的也是这个仓库,仓库是一个容器,所以会有边界值,0和仓库可存放上限,在这个上限内,可以设置多种级别,不同的级别可以执行不同的策略流程. (3)本案例使用知识点: Thread.curre

多线程编程基础知识

多线程编程基础知识 http://www.cnblogs.com/cy163/archive/2006/11/02/547428.html 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.因此掌握

.NET基础拾遗(5)多线程开发基础

Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 一.多线程编程的基本概念 下面的一些基本概念可能和.NET的联系并不大,但对于掌握.NET中的多线程开发来说却十分重要.我们在开始尝试多线程开发前,应该对这些基础知识有所掌握,并且能够在操作系统层面理解多线程的运行方式. 1.1 操作系统层面的进程和线程 (1)进程 进程代表了操作系统上运行着的一个应用程序.进程拥有自己的程序块

Java多线程编程基础之线程对象

在进入java平台的线程对象之前,基于基础篇(一)的一些问题,我先插入两个基本概念. [线程的并发与并行] 在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent).而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel). 在上面包括以后的所有论述中,请各位朋友谅解,我无法用最准确的词语来定义储

多线程的基础知识

多线程编程基础知识 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.因此掌握多线程多任务设计方法对每个程序员都是必需要掌握的.本实例针对多线程技术在应用中经常遇到的问题,如线程间的通信.同步等,分

多线程(基础篇1)

在多线程这一系列文章中,我们将讲述C#语言中多线程的相关知识,在多线程(基础篇)中我们将学习以下知识点: 创建线程 中止线程 线程等待 终止线程 确定线程的状态 线程优先级 前台线程和后台线程 向线程传递参数 使用C#的lock关键字锁定线程 使用Monitor锁定线程 处理异常 一.创建线程 在整个系列文章中,我们主要使用Visual Studio 2015作为线程编程的主要工具.在C#语言中创建.使用线程只需要按以下步骤编写即可: 1.启动Visual Studio 2016,新建一个控制台

Boost::Thread 多线程的基础知识

Boost.Thread可以使用多线程执行可移植C++代码中的共享数据.它提供了一些类和函数来管理线程本身,还有其它一些为了实现在线程之间同步数据或者提供针对特定单个线程的数据拷贝.头文件:#include <boost/thread.hpp> 线程定义boost::thread 类是负责启动和管理线程.每个boost::thread对象代表一个单独的执行线程,是不可拷贝的.由于它是可以被移动到,所以它们可以被保存到会改变大小的容器中,并且从函数返回.这使得线程创建的详细信息可以被封装到一个函

多线程(基础篇3)

在上一篇多线程(基础篇2)中,我们主要讲述了确定线程的状态.线程优先级.前台线程和后台线程以及向线程传递参数的知识,在这一篇中我们将讲述如何使用C#的lock关键字锁定线程.使用Monitor锁定线程以及线程中的异常处理. 九.使用C#的lock关键字锁定线程 1.使用Visual Studio 2015创建一个新的控制台应用程序. 2.双击打开"Program.cs"文件,然后修改为如下代码: 1 using System; 2 using System.Threading; 3 u

多线程(基础篇1)转载

在多线程这一系列文章中,我们将讲述C#语言中多线程的相关知识,在多线程(基础篇)中我们将学习以下知识点: 创建线程 中止线程 线程等待 终止线程 确定线程的状态 线程优先级 前台线程和后台线程 向线程传递参数 使用C#的lock关键字锁定线程 使用Monitor锁定线程 处理异常 一.创建线程 在整个系列文章中,我们主要使用Visual Studio 2015作为线程编程的主要工具.在C#语言中创建.使用线程只需要按以下步骤编写即可: 1.启动Visual Studio 2016,新建一个控制台