多线程-2

System.Threading名称空间中的部分类型

 Interlocket   为被多个线程共享访问的类型提供院子操作。

 Monitor 使用锁定和等待信号来同步线程对象。C#的lock关键字在后台使用的就是Monitor对象

 Mutex  互斥体,可用于应用程序域边界之间的同步。

 ParameterizedThreadStart 委托,它允许线程调用包含任意多个参数的方法

 Semaphore 用于限制对一个资源或一类资源的并发访问的线程数量

 Thread 代表CLR中执行线程。使用这个类型,能够在初始的应用程序域中创建额外的线程

  ThreadPool 用于和一个进程(由CLR维护的)线程池交互

  ThreadPriority 代表了线程调度的优先级别(Highest Normal等)

  ThreadStart  该委托定义一个线程调用的方法(无参)和ParameterizedThreadStart委托不同,后者提供一个有参方法。

  ThreadState 代表线程处于的状态(Running Aborted等)

  Timer   提供以指定的时间间隔执行方法的机制(不太稳定,个人测试,最好用DispatcherTimer)

  TimerCallback 该委托类型应与Timer类型一起使用

Thread类型的主要静态成员:他是一个面向对象的包装器,包装特定应用程序域中的某个执行单元(方法)。

静态成员:

CurrentContext 只读属性,返回当前线程的上下文

CurrentThread 只读属性,返回当前线程的引用

GetDomain()和GetDomainID() 返回当前应用程序域的引用或当前线程正在运行的域的ID

Sleep() 将当前线程挂起指定时间

主要的实例级成员:

IsAlive 返回布尔值,指示线程是否开始

IsBackgroud 获取或设置一个值,只是线程是否为后台线程(后台线程不会阻塞主线程,即主线程结束后后台线程自动结束,也可以说前台线程优于一切后台线程)

Name 给线程指定友好的名字

Priority 获取或设置线程调度的优先级(没什么用处)

ThreadState 获取当前线程的状态

Abort() 通知CLR尽快终止本线程

Interrupt() 中断当前线程

Join() 阻塞调用线程,直到某个(调用Join()的)线程终止为止

Resume() 使以挂起的线程继续执行

Start()通知 CLR尽快执行本线程

Suspend()挂起当前线程,如果线程已经挂起,调用Suspend()则不起作用

线程创建步骤:

Thread th=new Thread(new ThreadStart(

()=>{

Console.WriteLine("running in second thread,thread id is:{0}",Thread.CurrentThread.ManagedThreadId);

}

));

th.Start();

主线成中的方法优于线程方法,会首先执行。因此下面需要通过同步方式来实现线程调用

控制。

AutoResetEvent类,为解决上面问题提供依据:

方法:1.private AutoResetEvent waitHandler=new AutoResetEvent(false)

           2.在线程的最后加入:waitHandler.Set(); //用于设置线程结束,类似p-v操作 用于通知其他线程,该线程已经结束

           3.在线程调用后主线程方法前加上:waitHandler.waitOne();//等待,直到收到通知,通知由waitHandler.set()执行。

前台线程和后台线程:isBackground   true 为后台线程

前台线程能阻止应用程序终结,后台线程不会。一直到所有的前台线程终止后,CLR才能关闭应用程序(即卸载承载的应用程序域)

后台线程:(有时也叫守护线程,Daemon thread) 被CLR认为是程序执行中可作出牺牲的途径,即在任何时候,应当应用程序域卸载时,所有的后台线程也会被自动终止。

并发问题

Thread[] threads=new Thread[10];

for(int i=0;i<10;i++){threads[i]=new Thread(new ThreadStart(p.PrinterNumbers()); 

foreach(Thread t in threads){t.Start();}  

//以上10个线程同时执行时,并不是按顺序执行的。会出现因为时间片分配导致乱序问题。

因此需要同步。

同步方法1.使用lock()关键字进行同步,lock(this){同步的代码块,即共享代码块}

如果试图锁定静态方法中的代码,只需要生命一个私有静态对象成员变量作为锁定标记即可。

同步方法2.使用System.Threading.Monitor类型进行同步

try{ Monitor.Enter(threadLock) }catch(Exception ex){}finally{ monitor.Exit(threadLock)}

同步方法3:System.Threading.Interlocked 类型进行同步

System.Threading.Interlocked类型的部分静态成员

CompareExchange()  安全的比较两个值是否相等,如果相等,将第3个值与其中1搁置交换

Decrement()安全递减1

Exchane()安全地交换数据

Increment() 安全递加1

同步方法4:使用[Synchronization]特性进行同步

位于System.Runtime.Remoting.Contexts命名空间

[Synchronization]标记的类、方法 都在同步上下文中,简单但缺乏灵活性

 

posted @   丹心石  阅读(151)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示