zoukankan      html  css  js  c++  java
  • 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 中国大陆许可协议进行许可。

  • 相关阅读:
    tomcat源码springboot搭建的跑包含websocket的项目
    tomcat源码ant编译
    职责链设计模式最简单的实例
    完美解决asp.net core 3.1 两个AuthenticationScheme(cookie,jwt)共存在一个项目中
    基于领域驱动设计(DDD)超轻量级快速开发架构(二)动态linq查询的实现方式
    Html5 在手机端 input 默认弹出英文键盘
    Html Table 表格 画斜线
    多个单列索引和联合索引的区别
    springboot常用功能
    前端代码评审(Code Review)
  • 原文地址:https://www.cnblogs.com/luomingui/p/2044427.html
Copyright © 2011-2022 走看看