c# – Thread.Sleep(Timeout.Infinite)的用例是什么?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Thread.Sleep(Timeout.Infinite)的用例是什么?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1936字,纯文字阅读大概需要3分钟。
内容图文
我碰巧关注传递给System.Threading.Thread.Sleep(int millisecondsTimeout)的参数的intellisense工具提示,说“(…)指定System.Threading.Timeout.Infinite以无限期地阻塞线程”.我很好奇.
我可以理解为什么在可能无限循环中可能包含短的非活动延迟,因此当需要在休眠线程中没有立即动作时,它会向其他执行线程产生处理能力,尽管我通常更喜欢用EventWaitHandlers实现这样的延迟,这样我就可以避免等待如果我发信号通知线程从另一个线程正常结束执行,则完全休眠延迟.
但我无法确定何时可能需要无限期地挂起一个线程,并且在某种程度上,据我所知,只能通过一个相当不合适的Thread.Abort()/ ThreadAbortException对来中断.
那么我可能想要无限期挂起线程的工作场景是什么?
解决方法:
这是一个非常漫长的故事,我不得不挥手让我觉得可以理解.大多数程序员认为Thread.Sleep()将线程置于休眠状态并阻止它执行任何代码.这不准确. Thread.Sleep(Infinite)等同于Application.Run().不开玩笑.
这在现实生活中并不经常发生,它主要与自定义托管方案相关.获取代码以在特定线程上运行通常是处理非线程安全的代码以及Application.Run()存在的主要原因的重要特性.但Windows公开了另一种方法,在更低的层次上,底层的api是QueueUserAPC().这个函数的.NET类似是BeginInvoke().
这需要线程进行协作,就像它调用Application.Run()时一样.线程必须处于“可警告的等待状态”,执行可以中断的阻塞功能. CLR本身不执行睡眠,它将作业传递给CLR host.大多数主机只执行SleepEx(),为bAlertable参数传递TRUE.该线程现在处于执行QueueUserAPC()发布的任何请求的状态.就像它在Application.Run()调度程序循环中正在执行时一样.
在框架中,内核功能根本没有公开.这种代码很难做到正确,重新入侵的错误非常讨厌.由于大多数被Application.DoEvents()或者位置不佳的MessageBox.Show()所困扰的程序员都可以证明.但是,它是自定义主机方案中的有效方案.主机可以使用此机制获取在特定线程上运行的C#代码.所以有可能通过Infinite,因为设计师不想故意禁用这种情况.如果主持人作者可以做到这一点,那么他们会让你知道.我不知道一个实际的例子.
更实际的是,您每天都会使用此功能.它是实现System.Threading.Timer和System.Timers.Timer的方式.通过CLR中的一个线程完成,该线程在您使用任何计时器时立即启动,它在其核心使用SleepEx(INFINITE, TRUE).
内容总结
以上是互联网集市为您收集整理的c# – Thread.Sleep(Timeout.Infinite)的用例是什么?全部内容,希望文章能够帮你解决c# – Thread.Sleep(Timeout.Infinite)的用例是什么?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。