C# 中的 Thread.Sleep():它是让实例化对象的线程休眠,还是让我从中调用方法的线程休眠?
Posted
技术标签:
【中文标题】C# 中的 Thread.Sleep():它是让实例化对象的线程休眠,还是让我从中调用方法的线程休眠?【英文标题】:Thread.Sleep() in C#: Does it sleep the thread the object was instantiated in, or the thread i am calling the method from? 【发布时间】:2014-07-29 14:19:49 【问题描述】:我正在使用 C# 编写一个程序,该程序有一个主线程,我在其中创建了一堆技能类的实例。示例:_fire、_ice、_thunderbolt。你可能已经猜到了,这些都是各种魔法技能。
我从主线程生成了第二个线程并用它来做很多后台工作。除其他事项外,我希望该线程调用类技能中的一个方法,称为 useSkill()。
问题:如果我在该 useSkill() 方法中放置一个 Thread.Sleep(1000),它会在主线程(对象被实例化的地方)休眠,还是会在后台线程休眠, 方法是从哪里调用的?
非常感谢!
【问题讨论】:
在谷歌中输入Class.Method
几乎总是会返回一个 MSDN 链接作为第一个结果之一。这是Thread.Sleep
。 MSDN 是(除其他外).NET 框架的文档。
只要您使用 Visual Studio 并且您的指针位于标准 .net 方法上,将光标放在方法上并按 F1 几乎总是会在默认浏览器中打开 MSDN 页面。
感谢 George、Zenuka 等人。我确实找到了关于它的 MSDN 文章,但无法从那篇文章中得出正确的结论。在计时器允许的情况下接受 Zenuka 的回答。再次感谢!
文档中的“当前线程”似乎相当清楚。
彼得,即使有些事情你很清楚并不意味着其他人都清楚。至少,这是相当清楚的。
【参考方案1】:
Thread.Sleep(..)
阻塞/休眠当前线程:MSDN
因此,如果您要在主线程中实例化对象,但从线程 A 调用包含 Thread.Sleep(..)
的 UseSkill()
方法,那么线程 A 将被阻塞或休眠。但是,如果您从构造函数中调用 UseSkill()
方法并在主线程中实例化对象,则主线程将被阻塞/休眠。
此外,您可以使用“线程”窗口进行调试并查看阻塞会发生在哪个线程中(转到“调试”->“窗口”->“线程调试时)。
【讨论】:
只是为了澄清 OP - 这意味着它将休眠调用Thread.Sleep
的线程以上是关于C# 中的 Thread.Sleep():它是让实例化对象的线程休眠,还是让我从中调用方法的线程休眠?的主要内容,如果未能解决你的问题,请参考以下文章
C#中的Task.Delay()和Thread.Sleep()区别
如何在 C# 中重新启动任务?或如何重新启动 Thread.Sleep()?