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(1) 有啥影响?

C#中关于Thread.sleep(1000)的问题!!

如何在 C# 中重新启动任务?或如何重新启动 Thread.Sleep()?

C# Thread.Sleep() _PC 之间执行的其他时间

c#中怎样建立定时器?用以替代thread.sleep(),克服sleep延时不精确的问题。