C# ----- 线程介绍(一)

C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行。一个C#程序开始于一个单线程,这个单线程是操作系统自动创建的,并具有多线程创建额外的线程。这里的一个简单的例子及其输出:

结果:

主线程创建了一个新线程“t”,它运行了一个重复打印字母"y"的方法,同时主线程重复但因字母“x”。CLR分配每个线程到它自己的内存堆栈上,来保证局部变量的分离运行。在接下来的方法中我们定义了一个局部变量,然后在主线程和新创建的线程上同时地调用这个方法。

 线程是如何工作的

线程被一个线程协调程序管理着——一个CLR委托给操作系统的函数。线程协调程序确保将所有活动的线程被分配适当的执行时间;并且那些等待或阻止的线程——比如说在排它锁中、或在用户输入——都是不消耗CPU时间的。

在单核处理器的电脑中,线程协调程序完成一个时间片之后迅速地在活动的线程之间进行切换执行。

在多核的电脑中,多线程被实现成混合时间片和真实的并发——不同的线程在不同的CPU上运行。这几乎可以肯定仍然会出现一些时间切片, 由于操作系统的需要服务自己的线程,以及一些其他的应用程序。

   线程 vs. 进程

    属于一个单一的应用程序的所有的线程逻辑上被包含在一个进程中,进程指一个应用程序所运行的操作系统单元。

线程于进程有某些相似的地方:比如说进程通常以时间片方式与其它在电脑中运行的进程的方式与一个C#程序线程运行的方式大致相同。二者的关键区别在于进程彼此是完全隔绝的。线程与运行在相同程序其它线程共享(堆heap)内存,这就是线程为何如此有用:一个线程可以在后台读取数据,而另一个线程可以在前台展现已读取的数据。

  何时使用多线程

多线程程序一般被用来在后台执行耗时的任务。主线程保持运行,并且工作线程做它的后台工作。对于Windows 窗体程序来说,如果主线程试图执行耗时操作,键盘和鼠标的操作会变的迟钝,程序也会失去响应。由于这个原因,应该在工作线程中运行一个耗时任务时添加一个工作线程,即使在主线程上有一个有好的提示“处理中...”,以防止工作无法继续。

其他实例:

线程t执行Go函数,同时主线程也调用Go,执行结果是:

用匿名函数方式:可以传递多个参数,且也不需要类型转换

还有一种传参的方式是传一个实例过去,而不是传一个静态函数:

线程命名:线程有一个Name属性,在调试时很有用。

线程的异常处理:线程一旦启动,任何在try/catch范围内创建线程的代码块与try/catch就没有什么关系了。

结果无输出:

时间: 2024-11-03 22:43:26

C# ----- 线程介绍(一)的相关文章

进程/线程介绍

一.进程 进程可以认为是程序执行时的一个实例.进程是系统进行资源分配的独立的实体,且每个进程拥有独立 的地址空间.一个进程无法直接访问另一个进程的变量和数据结构,如果希望让一个进程访问另一个进程 的资源,需要使用进程间通信,比如:管道,有名管道,信号,信号量,消息队列,套接字等. 一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间.线程和进程的一个主要区别是,同一程序内 的多个线程会共享部分状态,多个线程可以读写同一块内存(一个进程无法直接访问另一进程的内存).同时 每个线程还拥有自己的寄

操作系统--线程介绍

线程介绍 线程是进程中的一个实体,是独立调度和分派的基本单位. 线程自身基本上不拥有系统资源,只拥有少许运行中必不可少的私有资源.线程可与同属一个进程的其他线程共享进程的全部资源. 线程使用的目标 线程使用的目标:既能提高进程并发度,又能降低系统的额外开销. 线程的实现 实现:将进程的资源申请和调度属性分开.即进程作为资源的申请和拥有者,但不作为调度的基本单位.这样,就产生了线程的概念. 线程状态 线程状态:就绪,执行,阻塞. 线程类型 用户级线程:用户级线程的创建,撤销及切换等操作全部由支持线

JVM 内部运行线程介绍

线程 所属 说明 Attach Listener JVM           Attach Listener线程是负责接收到外部的命令,而对该命令进行执行的并且吧结果返回给发送者.通常我们会用一些命令去要求jvm给我们一些反馈信息,如:java -version.jmap.jstack等等.如果该线程在jvm启动的时候没有初始化,那么,则会在用户第一次执行jvm命令时,得到启动. Signal Dispatcher JVM         前面我们提到第一个Attach Listener线程的职

java jstack dump 线程 介绍 解释

最近抽时间把JVM运行过程中产生的一些线程进行了整理,主要是围绕着我们系统jstack生成的文件为参照依据.  前段时间因为系统代码问题,造成性能到了天花板,于是就dump了一份stack出来进行分析.  看stack其实也需要一定的经验,毕竟它里面很多线程不可能都是有问题,所以,需要对他们有一定认识.  现在市面上很少有人对这一块做整理,所以,导致很多新人在拿到一个stack文件之后,也是一头雾水. 下面我把这次整理的一些个人认为比较重要的线程列出来,供大家参考. 如果发现有什么写得不对或者可

Perl线程介绍

Perl 中的线程 本文首先概述了线程的概念和意义,接着回顾了 Perl 语言中对线程支持的演化历史,然后通过一系列示例重点介绍了 Perl 中线程的实现,数据的共享以及线程间的同步,最后归纳并总结了全文主要内容. 线程概述 线程是一个单一的执行流程,它是所有程序执行过程中最小的控制单位,即能被 CPU 所调度的最小任务单元.线程与进程之间既有联系,又完全不同.简单地说,一个线程必然属于某一个进程,而一个进程包含至少一个或者多个线程.早期的计算机系统一次只能运行一个程序,因此,当有多个程序需要执

msyql主从复制线程介绍

主从复制原理 三个线程: 主服务器Binlog Dump线程->用来给从库 i/o线程传binlog: 从服务器I/O线程 ->请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中: 从服务器SQL线程->读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致: mysql主从复制存在的问题: 主库宕机后,数据可能丢失 从库只有一个sql Thread,主库写压力大,复制很可能延时 解决方法: 半同步复制---

4.6、Libgdx线程介绍

(原文:http://www.libgdx.cn/topic/48/4-6-libgdx%E7%BA%BF%E7%A8%8B%E4%BB%8B%E7%BB%8D) 所有的ApplicationListener方法都在同一线程中调用.这个线程是可以调用OpenGL的渲染线程.对大部分游戏来说,更新逻辑或者渲染一般都放在ApplicationListener.render()方法中. 任何的图像操作都会在渲染线程中操作,在其他线程中造作会导致未定义的行为,这是因为OpenGL context仅仅在渲

c# ----- 线程介绍(二)

内容提要: 对多线程进行同步,主要用到的是MethodImplAttribute 类 和 SynchronizationAttribute 类,本质上还是基于Lock的实现的. 一个简单如小明和小红两个人用都是主附银行卡,两个人都可以对帐户进行操作,比如帐户余额1000元,比如两个人几乎同时进行取钱600元的操作. 代码如下:我们没有进行任何的同步措施,我们运行一下代码,看一下结果: 结果是不对的,我们来对程序进行修改.引入MethodImplAttribute 类: 在使用 MethodImp

iOS-多线程介绍

一.前言部分 最近在面试,重新温习了一遍多线程,希望加深一遍对于多线程的理解. 1.什么是进程? 1).要了解线程我们必须先了解进程,通俗来讲进程就是在系统中运行的一个应用程序. 2).每个线程之间是独立存在的,分别运行在其专用的且受保护的内存空间中. 3).比如打开QQ或Xcode系统会分别开启两个进程 如图: 4).我们可以通过"活动监视器"查看Mac系统中所开启的进程. 2.什么是线程? 1).一个进程要想执行任务必须得有线程,即一个进程至少要有一个线程. 2).线程是进程的基本