• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > c#多线程编程基础

c#多线程编程基础

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#多线程,c#多线程编程实例,c#多线程编程,c#多线程同步,c#多线程实例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

无论您是为具有单个处理器的计算机还是为具有多个处理器的计算机进行开发,您都希望应用程序为用户提供最好的响应性能,即使应用程序当前正在完成其他工作。要使应用程序能够快速响应用户操作,同时在用户事件之间或者甚至在用户事件期间利用处理器,最强大的方式之一是使用多线程技术。

多线程:线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程。如果某个线程进行一次长延迟操作, 处理器就切换到另一个线程执行。这样,多个线程的并行(并发)执行隐藏了长延迟,提高了处理器资源利用率,从而提高了整体性能。多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率

一、进程与线程

进程,是操作系统进行资源调度和分配的基本单位。是由进程控制块、程序段、数据段三部分组成。一个进程可以包含若干线程(Thread),线程可以帮助应用程序同时做几件事(比 如一个线程向磁盘写入文件,另一个则接收用户的按键操作并及时做出反应,互相不干扰),在程序被运行后中,系统首先要做的就是为该程序进程建立一个默认线程,然后程序可 以根据需要自行添加或删除相关的线程。它是可并发执行的程序。在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位,也是称活动、路径或任务,它有两方面性质:活动性、并发性。进程可以划分为运行、阻塞、就绪三种状态,并随一定条件而相互转化:就绪--运行,运行--阻塞,阻塞--就绪。

线程(thread),线程是CPU调度和执行的最小单位。有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。

主线程,进程创建时,默认创建一个线程,这个线程就是主线程。主线程是产生其他子线程的线程,同时,主线程必须是最后一个结束执行的线程,它完成各种关闭其他子线程的操作。尽管主线程是程序开始时自动创建的,它也可以通过Thead类对象来控制,通过调用CurrentThread方法获得当前线程的引用

多线程的优势:进程有独立的地址空间,同一进程内的线程共享进程的地址空间。启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。

二、多线程优点

1、提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。
2、使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
3、改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。。

多线程尽管优势明显,但是线程并发冲突、同步以及管理跟踪,可能给系统带来很多不确定性,这些必须引起足够重视。

废话不多说开始我们的多线程之旅。

三、多线程的应用场合:

简单总结了一下,一般有两种情况:

1)多个线程,完成同类任务,提高并发性能

2)一个任务有多个独立的步骤,多个线程并发执行各子任务,提高任务处理效率

四、案例--搬运工

在我们现实生活中,经常看到这样的场景。有一堆货物,有几个搬运工负责将货物搬运到指定地点。但是搬运工能力不同,有人一次能搬多箱,有人走路比较慢,搬运一趟的时间间隔比较长。搬运工,各自搬运,无先后,互不干扰。我们如何在程序中实现这种场景呢?

案例分析:
这个就是最简单的多线程的实际案例。每个人相当于一个线程,并发执行。当货物搬运完毕后,每个线程自动停止。这里暂时不考虑死锁情况。

案例代码:

namespace MutiThreadSample.Transport
{
    /// <summary>
    /// 搬运工
    /// </summary>
    public class Mover
    {
        /// <summary>
        /// 总数
        /// </summary>
        public static int GoodsTotal { get; set; }
        /// <summary>
        /// 间隔时间
        /// </summary>
        public static int IntervalTime { get; set; }
        /// <summary>
        /// 名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 单位时间搬运量
        /// </summary>
        public int LaborAmount { get; set; }
        /// <summary>
        /// 搬运
        /// </summary>
        public void Move()
        {
            while (GoodsTotal > 0)
            {
                GoodsTotal -= LaborAmount;
                Console.WriteLine("搬运者:{0} 于 {1} 搬运货物 {2}",this.Name,DateTime.Now.Millisecond,this.LaborAmount);
                Thread.Sleep(IntervalTime);
                Console.WriteLine("搬运者:{0} Continue",this.Name);
            }
        }
        /// <summary>
        /// 搬运
        /// </summary>
        /// <param name="interval">时间间隔</param>
        public void Move(object interval)
        {
            int tempInterval = 0;
            if (!int.TryParse(interval.ToString(), out tempInterval))
            {
                tempInterval = IntervalTime;
            }           
            while (GoodsTotal > 0)
            {
                GoodsTotal -= LaborAmount;
                Console.WriteLine("搬运者:{0} 于 {1} 搬运货物 {2}", this.Name, DateTime.Now.Millisecond, this.LaborAmount);
                Thread.Sleep(tempInterval);<

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#多线程编程详解
  • C#制作多线程处理强化版网络爬虫
  • C#向线程中传递多个参数的解决方法(两种)
  • C#往线程里传递参数的方法小结
  • C#中实现线程同步lock关键字的用法详解
  • C#下载歌词文件的同步和异步方法
  • C#多线程传递参数及任务用法示例
  • C#模式画刷HatchBrush用法实例
  • C#纹理画刷TextureBrush用法实例
  • c#实现多线程局域网聊天系统

相关文章

  • 2017-05-28C# winform 模拟键盘输入自动接入访问网络的实例
  • 2017-05-28C# 如何判断两个文件内容是否相同的方法
  • 2017-05-28C#实现输入法功能详解
  • 2017-05-28WinForm实现程序一段时间不运行自动关闭的方法
  • 2017-05-28C#基础概念二十五问 16-20
  • 2017-05-28C#隐藏手机号、邮箱等敏感信息的实现方法
  • 2017-05-28C#根据年月日计算星期几的函数
  • 2017-05-28C#实现向指定文本文件添加内容的方法
  • 2017-05-28FtpHelper实现ftp服务器文件读写操作(C#)
  • 2017-05-28基于C#后台调用跨域MVC服务及带Cookie验证的实现

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#连接MySql数据库的方法
    • C#控制台进行文件读写的方法
    • C#实现在控制台输入密码显示星号的方法
    • C#自定义针对URL地址的处理类实例
    • c#通过ip获取地理信息
    • c# 引用类型构造器
    • C#为配置文件加密的实现方法
    • C#实现IP摄像头的方法
    • C#开发中的垃圾回收机制简析
    • C#数据结构揭秘一

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有