在多线程应用程序中使用Thread.Sleep的原因是什么?

时间:2011-03-29 18:25:59

标签: c# .net multithreading parallel-processing sleep

通常,当我看到一些多线程代码时,我会在代码中看到Thread.Sleep()语句。

我甚至遇到了崩溃问题,我试图找出问题,因此大部分多线程代码都被注释掉了,然后慢慢地将它带到了最后一块,当我添加了一个for语句时:

for ( int i = 0; i < 1000000; ++i )
    ++i;
它并没有崩溃。所以现在我将其替换为Thread.Sleep(),它似乎有效。我不能轻易地重新发布它在这里发布,但是使用多线程应用程序所需的Thread.Sleep()

他们的目的是什么?如果不使用它会导致意想不到的结果吗?

编辑:顺便说一下,我正在使用BackgroundWorker并且只在那里实现我的东西,但不确定是什么导致了这一点。虽然我使用的API是托管应用程序,其中应用程序不是多线程的。所以例如我认为我不能同时在几个线程上调用它的API函数。不确定,但这是我的猜测。

5 个答案:

答案 0 :(得分:6)

通常,Thread.Sleep表示设计不良。话虽这么说,它比吃100%的CPU核心时间更好,这就是上面的for循环所做的。

更好的选择通常是使用WaitHandle,例如ManualResetEvent,以便在发生“事件”(这是延迟的原因)时触发线程执行的继续。或者,在许多情况下,使用Timer也可以正常工作。

答案 1 :(得分:3)

Thread.Sleep(1)允许切换到执行另一个线程。因此,如果你有比核心/处理器更多的线程,你知道“现在我在这个线程做了很多工作,下一步工作可以稍微完成”你调用Thread.Sleep(1)并允许另一个线程做一些工作比原生切换器更快“暂停”当前执行的线程。

答案 2 :(得分:1)

尝试这样做:编写一个启动100个线程的程序,并将每个线程放入for循环中,如上所述。然后写另一个启动100个线程并改为使用Thread.Sleep

运行它们并比较CPU使用率。你会明白这一点。 =)

答案 3 :(得分:1)

Thread.Sleep()只会导致执行线程暂停指定的持续时间。

我见过许多开发人员使用Thread.Sleep(),因为他们可能不会处理依赖线程的连接。他们只是使用Thread.Sleep()强制一个线程等待一段时间,直到认为他们的其他线程已经完成并且他们的数据可用。

如果你有两个线程需要相互等待继续进行处理,你应该真正使用.NET内置的机制来处理这样的情况(即。ManualResetEvent等。)

答案 4 :(得分:1)

Thread.Sleep()可以在某些情况下使用,例如。看门狗线程。

然而,在你的情况下,它可能似乎不是其他人所指出的最佳解决方案。

没有代码示例,很难说,但根据您的描述,我认为这不是Thread.Sleep()的问题。我怀疑你可能会遇到竞争条件 - 这通常是你在多线程代码中经历“随机”错误行为甚至是“随机”崩溃的原因 - 看起来就像你正在经历的那样。

无论出于何种原因,你的for循环可能会导致竞争条件的微妙关键时刻不常发生,但它不能解决根本原因。在进行多线程编程时需要注意许多陷阱,如果你想避免这些,我只能建议你阅读这个主题。

我建议您阅读http://www.amazon.com/Concurrent-Programming-Windows-Joe-Duffy/dp/032143482X