C# 多线程 学习

什么是进程?


当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资

源。而一个进程又是由多个线程所组成的。

什么是线程?


线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区

是共享的,即不同的线程可以执行同样的函数。

什么是多线程?


多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任

务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

多线程的好处:


可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不

是等待,这样就大大提高了程序的效率。

多线程的不利方面:


线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
多线程需要协调和管理,所以需要CPU时间跟踪线程;
线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
线程太多会导致控制太复杂,最终可能造成很多Bug;

接下来将对C#编程中的多线程机制进行探讨。为了省去创建GUI那些繁琐的步骤,更清晰地逼近线程

的本质,接下来的所有程序都是控制台程序,程序最后的Console.ReadLine()是为了使程序中途停

下来,以便看清楚执行过程中的输出。
DoNET提供了那些控件或类来操作线程?


 线程操作在 System.Threading 命名空间下

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

Thread.ThreadState 属性

这个属性代表了线程运行时状态,在不同的情况下有不同的值,我们有时候可以通过对该值的判断来设计程序流程。
ThreadState 属性的取值如下:
Aborted:线程已停止;
AbortRequested:线程的Thread.Abort()方法已被调用,但是线程还未停止;
Background:线程在后台执行,与属性Thread.IsBackground有关;
Running:线程正在正常运行;
Stopped:线程已经被停止;
StopRequested:线程正在被要求停止;
Suspended:线程已经被挂起(此状态下,可以通过调用Resume()方法重新运行);
SuspendRequested:线程正在要求被挂起,但是未来得及响应;
Unstarted:未调用Thread.Start()开始线程的运行;
WaitSleepJoin:线程因为调用了Wait(),Sleep()或Join()等方法处于封锁状态;

线程的优先级

当线程之间争夺CPU时间时,CPU 是按照线程的优先级给予服务的。在C#应用程序中,用户可以设定5个不同的优先级,由高到低分别是Highest,AboveNormal,Normal,BelowNormal,Lowest,在创建线程时如果不指定优先级,那么系统默认为ThreadPriority.Normal

给一个线程指定优先级,我们可以使用如下代码:
//设定优先级为最低
myThread.Priority=ThreadPriority.Lowest;

互斥对象 Mutex类 和lock关键字,

AutoResetEvent 信号灯

Monitor监视器

ThreadPool线程池

。NET多线程 (BackgroundWorker组件使用说明)

一.            概述

BackgroundWorker是·NET 2.0提供的一个多线程组件,在应用程序中使用,可以非常简单方便地实现UI控件通信,并自动处理多线程冲突问题。

二.            基本属性

1.      WorkerReportsProgress ,bool:是否允许报告进度;

2.      WorkerSupportsCancellation,bool:是否允许取消线程。

3.      CancellationPending,bool,get:读取用户是否取消该线程。

三.            基本事件

1.      DoWork:工作者线程

2.      RunWorkerCompleted :线程进度报告

3.      ProgressChanged:线程结束报告

四.            基本方法

1.      RunWorkerAsync() :启动工作者线程;

2.      CancelAsync():取消工作者线程;

3.      ReportProgress(int);   报告进度

五.      代码

//启动

private void btnStart_Click(object sender, EventArgs e)

{

    this.btnStart.Enabled = false;

    this.btnStop.Enabled = true;

    this.backgroundWorker.RunWorkerAsync();

}

//通知线程停止

private void btnStop_Click(object sender, EventArgs e)

{

    this.backgroundWorker.CancelAsync();

}

//工作者线程

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)

{

    for (int i = 0; i < 150; i++)

   {

        if (backgroundWorker.CancellationPending)   //查看用户是否取消该线程

        {

            break;

        }

        System.Threading.Thread.Sleep(50);          //干点实际的事

        backgroundWorker.ReportProgress(i);         //报告进度

    }

}

//线程进度报告

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)

{

    this.progressBar1.Value = e.ProgressPercentage * 100 / 150;

}

//线程结束报告

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{           

    this.btnStart.Enabled = true;

    this.btnStop.Enabled = false;

}    

资料:

C#多线程教程

权威.NET多线程详解(源码示例)  

 如果你的进程没有响应的时候可以看一下这篇 http://www.cnblogs.com/killmyday/articles/1394467.html

作者:罗敏贵
邮箱:minguiluo@163.com
QQ群:34178394 建群 主要是寻找志同道合的人士一起学习和讨论自己的所学所思
出处:http://luomingui.cnblogs.com/
说明:专注于微软平台项目架构、熟悉设计模式、架构设计、敏捷个人和项目管理。现主要从事WinForm、ASP.NET、等方面的项目开发、架构、管理工作。文章为作者平时里的思考和练习,可能有不当之处,请博客园的园友们多提宝贵意见。
知识共享许可协议本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。

原文地址:https://www.cnblogs.com/luomingui/p/2044427.html