Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.Net多线程:睡眠、等待、中断、加入_.net_Join_Sleep_Wait_Interrupt - Fatal编程技术网

.Net多线程:睡眠、等待、中断、加入

.Net多线程:睡眠、等待、中断、加入,.net,join,sleep,wait,interrupt,.net,Join,Sleep,Wait,Interrupt,我对何时使用它们感到困惑。。我知道所有这些方法都构成一个线程块 那么它们的具体用法是什么呢 还有,等待()的首选技术是什么。。(仅与ManualResetEvent相同?睡眠:我不建议使用此选项,除非它是一个执行持续轮询的后台线程,因为它可以屏蔽竞争条件。为发送给它的最小参数生成时间片,操作系统中的时间限制量子决定实际粒度(可能比你告诉它的时间要长) 等待:在.NET中,这是一个spinwait,用于锁定。它将处理器放入一个小循环(通常是2条指令),基本上是一个睡眠,它阻塞线程,但继续执行而不是

我对何时使用它们感到困惑。。我知道所有这些方法都构成一个线程块

那么它们的具体用法是什么呢


还有,等待()的首选技术是什么。。(仅与ManualResetEvent相同?

睡眠:我不建议使用此选项,除非它是一个执行持续轮询的后台线程,因为它可以屏蔽竞争条件。为发送给它的最小参数生成时间片,操作系统中的时间限制量子决定实际粒度(可能比你告诉它的时间要长)

等待:在.NET中,这是一个spinwait,用于锁定。它将处理器放入一个小循环(通常是2条指令),基本上是一个睡眠,它阻塞线程,但继续执行而不是产生时间片。或者可以是WaitOne,它在WaitHandle上等待接收信号。在这种情况下,线程将等待指定的时间量,以便接收信号,然后解除阻塞,或者您可以一直等待,直到接收到信号为止(可用于在异步操作上实现超时,也有其他用途)

中断:中断处于等待、睡眠或连接阻塞状态的线程


Join:将线程连接到当前上下文线程,并在连接的线程完成后取消阻止,用于等待继续执行所需的某些操作完成睡眠:我不建议使用此选项,除非它是一个执行持续轮询的后台线程,因为它可以屏蔽争用条件。为发送给它的最小参数生成时间片,操作系统中的时间限制量子决定实际粒度(可能比你告诉它的时间要长)

等待:在.NET中,这是一个spinwait,用于锁定。它将处理器放入一个小循环(通常是2条指令),基本上是一个睡眠,它阻塞线程,但继续执行而不是产生时间片。或者可以是WaitOne,它在WaitHandle上等待接收信号。在这种情况下,线程将等待指定的时间量,以便接收信号,然后解除阻塞,或者您可以一直等待,直到接收到信号为止(可用于在异步操作上实现超时,也有其他用途)

中断:中断处于等待、睡眠或连接阻塞状态的线程


Join:将线程连接到当前上下文线程并在连接的线程完成后取消阻止,用于等待需要继续的事情完成

上有一本由LINQPad和几本C#畅销书的作者Joseph Albahari编写的优秀免费电子书。如果你在阅读这些材料时付出一些努力,你的困惑就会消失……

有一本优秀的免费电子书,作者Joseph Albahari,LINQPad和几本C#畅销书的作者。如果你花点力气阅读这些材料,你的困惑就会消失…

我感觉OP的“等待”是指
WaitOne
WaitHandle(或提到的
ManualResetEvent
)的重载,它不会锁定CPU。@Groo,这很有意义,谢谢你的澄清。将编辑以修复此问题:)@Ramos,谢谢!这很简洁。我感觉OP的“Wait”是指
WaitOne
WaitHandle(或提到的
ManualResetEvent
)的重载,它不会锁定CPU。@Groo,这很有意义,感谢您的澄清。将编辑以修复此问题:)@Ramos,谢谢!这很简洁。在现代.NET中,你不应该考虑它们(你应该学习
任务
,和/或TPL…)。你有什么特别的问题要解决吗?@Damien_The_unsiver:旧的线程构造并没有从.NET和TPL中消失,理解这些差异肯定会对一个新手.NET程序员有所帮助。@Groo-如果我在指导一个新手.NET程序员,我会把他们指向
任务
。我不鼓励他们去看那些人们经常犯错误的旧观念。如果他们想对多线程进行一般性讨论,我仍然不会使用较旧的.NET结构作为讨论的基础。在现代.NET中,你不应该考虑它们(你应该学习
任务
和/或TPL…)。你有什么特别的问题要解决吗?@Damien_The_unsiver:旧的线程构造并没有从.NET和TPL中消失,理解这些差异肯定会对一个新手.NET程序员有所帮助。@Groo-如果我在指导一个新手.NET程序员,我会把他们指向
任务
。我不鼓励他们去看那些人们经常犯错误的旧观念。如果他们想对多线程进行一般性讨论,我仍然不会使用较旧的.NET结构作为讨论的基础。Thx kzen将对此进行研究。Thx kzen将对此进行研究。