C#学习笔记 ----线程、任务和同步

线程

线程有一个优先级、实际上正在处理的程序的位置计数器、一个存储其局部变量的栈

每个线程都有自己的栈,但程序代码的内存和堆由一个进程的所有线程共享

异步委托

创建线程的一种简单方式是定义一个委托,并异步调用它

投票 所创建的Delegate类提供了BeginInvoke()方法,BeginInvoke()方法总是有AsyncCallback和object类型的俩个额外参数

等待异步委托的结果的另一种方式是使用与IAsyncResult相关联的等待句柄

等待委托的结果的第三种方式是异步回调

Thread类

使用Thread类可以创建和控制线程

Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数

ThreadStart委托定义了一个返回类型为void的无参数方法

在创建了Thread对象后,就可以用Start()方法启动线程

给线程传递数据可以采用俩种方式。一种方式是使用带ParameterizedThreadStart委托参数的Thread构造函数

另一种方式是创建一个自定义类,把线程的方法定义为实例方法,这样就可以初始化实例的数据,之后启动线程

在默认情况下,用Thread类创建的线程是前台线程。

线程池中的线程总是后台线程

设置IsBackground属性,确定是前台线程还是后台线程

设置Priority属性,线程的优先级

Thread.ThreadState属性 线程状态

Thread.Sleep()、Thread.Abort()、Thread.Join()

线程池

由ThreadPool类托管

.线程池中的所有线程都是后台线程。如果进程的所有前台线程都结束了,所有的后台线程就会停止。不能把入池的线程改为前台线程。

.不能给入池的线程设置优先级或名称

.对于COM对象,入池的所有线程都是多线程单元(multithreaded apartment,MTA)线程。许多COM对象都需要单线程单元(single-threaded apartment,MTA)线程

.入池的线程只能用于时间较短的任务。如果线程一直要运行,就应使用thread类创建一个线程

任务

.NET 4包含新名称空间 System.Threading.Tasks

要启动任务,可以使用TaskFactory类或Task类的构造函数和Start()方法

Parallel类

在.NET 4中,另一个新增的抽象线程是Parallel类。

取消架构

.NET 4包含一个新的取消架构,允许以标准方式取消长时间运行的任务。

线程问题

如果两个或多个线程访问相同的对象,或者访问不同步的共享状态,就会出现争用条件

在死锁中,至少有俩个线程被挂起,并等待对象解除锁定

同步

C#为多个线程的同步提供了自己的关键字:lock语句。

WaitHandle是一个抽象基类,用于等待一个信号的设置。

Timer类

System.Threading名称空间中的Timer类提供了核心功能。在构造函数中,可以传递一个委托,该委托应按照指定的时间间隔调用。
System.Timers名称空间中的Timer类是一个组件,因为它派生自Component基类。

因此,可以把它从工具箱拖放到服务器应用程序的手机界面上。这个Timer类使用System.Threading.Timer,但提供了基于时间的机制,而不是基于委托的机制。

基于事件的异步模式

BackgroundWorker类是异步事件模式的一种实现方案。

时间: 2024-10-08 15:16:25

C#学习笔记 ----线程、任务和同步的相关文章

多线程编程学习笔记——线程同步(三)

接上文 多线程编程学习笔记——线程同步(一) 接上文 多线程编程学习笔记——线程同步(二) 七.使用Barrier类 Barrier类用于组织多个线程及时在某个时刻会面,其提供一个回调函数,每次线程调用了SignalAndWait方法后该回调函数就会被执行. 1.代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; //

多线程编程学习笔记——线程池(一)

接上文 多线程编程学习笔记——线程同步(一) 接上文 多线程编程学习笔记——线程同步(二) 接上文 多线程编程学习笔记——线程同步(三) 创建多线程操作是非常昂贵的,所以每个运行时间非常短的操作,创建多线程进行操作,可能并不能提高效率,反而降低了效率. 如果你有非常多的执行时间非常短的操作,那么适合作用线程池来提高效率,而不是自行创建多线程. 线程池,就是我们先分配一些资源到池子里,当我们需要使用时,则从池子中获取,用完了,再放回池子里. .NET中的线程池是受CLR管理的,TheadTool类

JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?

前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事.当然,在学校里考试之前当然要把所有内容学一遍和复习一遍.但是,到了社会里做事,很多时候都是边做边学.应聘如此,工作如此,很多的挑战都是如此.没办法,硬着头皮上吧. 3.5 线程的分组管理 在实际的开发过程当中,可能会有多个线程同时存在,这对批量处理有了需求.这就有点像用迅雷下载电视剧,假设你在同时

Python 学习笔记 - 线程(1)

这是第一篇Python多线程的学习笔记,看看什么是多线程,以及如何创建他. 之前Python写的脚本程序里面,我们用到的都是单进程单线程的操作. 例如 传统的单进程,单线程的程序 import time def f1(arg,):     time.sleep(5)     print(arg) for i in range(10):     f1(i) 然而很多时候,我们需要并发的同时处理多个任务,举个例子,一个播放软件在放电影的时候,他需要同时播放图形,声音,字幕,这个时候他就创建了一个播放

Python 学习笔记 - 线程(2)

前面学习了线程基本的概念和创建线程的两种方法,现在看看多线程如何处理竞争条件(racing condition)的问题. 比如说,下面的例子中 我使用了第二种创建的方式,自定义一个类,继承Thread类,然后自定义run()来执行我的方法.在这个run方法里面,每次都对全局变量加1 在主线程里面,他调用一个自己定义的函数,在这个函数里面创建了5000个线程:每个线程都加入一个列表,然后对每个对象都使用join,这是确保主线程等着直到所有子线程完成.最后输出结果 import time impor

操作系统学习笔记——线程

这篇博客是本人操作系统课的学习笔记,因为是"双语授课",所以有些中英夹杂. 本篇文章禁止转载 版权声明:本文为博主原创文章,未经博主允许不得转载.

java学习笔记 线程同步

在实现Runnable接口后,可以通过多个start方法来调用同一段代码资源,这也会导致一个问题就是资源可能不同步. 解决资源不同步的方法是,在同一时间段内,只允许一个线程来操作这个对象或方法,其他线程需等待此线程访问结束后才能继续执行,将其锁住. 关键字synchronized:表示只能有一个线程执行synchronized所声明的代码块或方法,并且在执行过程中其他方法不能锁定这个对象 .使用方式有同步代码块与同步方法,两者功能一样. 只能有一个同步方法访问该对象,其他方法若是同步的则不能访问

C#学习笔记---线程同步:互斥量、信号量、读写锁、条件变量

http://www.cnblogs.com/maxupeng/archive/2011/07/21/2112282.html 一.互斥量(mutex) 互斥量本质上是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁. 对互斥量进行加锁以后,任何其它试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁.如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为运行状态的线程可以对互斥量加锁,其它线程将会看到互斥锁依然被锁住,只能回去再次

Java学习笔记----线程2

获取当前线程对象的方法是:Thread.currentThread(); 当线程目标的run方法结束,意味着线程完成 线程的状态: 1)新状态:线程对象已经创建,但是还没有调用start方法 2)可运行状态:start方法被调用.或者运行之后,从阻塞等待睡眠回来后. 3)运行状态:开始运行,可以看场可运行状态时运行状态的一个缓冲 4)等待睡眠阻塞 状态:冻结状态 5)死亡,run方法结束 阻止线程运行: 睡眠:Thread.sleep() 线程的优先级和线程的让步: setPriority()