通常,当我看到一些多线程代码时,我会在代码中看到Thread.Sleep()
语句。
我甚至遇到了崩溃问题,我试图找出问题,因此大部分多线程代码都被注释掉了,然后慢慢地将它带到了最后一块,当我添加了一个for语句时:
for ( int i = 0; i < 1000000; ++i )
++i;
它并没有崩溃。所以现在我将其替换为Thread.Sleep()
,它似乎有效。我不能轻易地重新发布它在这里发布,但是使用多线程应用程序所需的Thread.Sleep()
?
他们的目的是什么?如果不使用它会导致意想不到的结果吗?
编辑:顺便说一下,我正在使用BackgroundWorker
并且只在那里实现我的东西,但不确定是什么导致了这一点。虽然我使用的API是托管应用程序,其中应用程序不是多线程的。所以例如我认为我不能同时在几个线程上调用它的API函数。不确定,但这是我的猜测。
答案 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