我想这个问题可以归结为“SpinWait vs. Block?”,但我想到可能有一个更有趣的答案,为什么几乎每个C#线程教程提出以下电话:在等待新线程产生时调用thread.sleep()
Thread newThread = new Thread(new ThreadStart(ThreadMethod));
newThread.Start()
while (!newThread.isAlive()) ;
Thread.Sleep(1); // Allow the new thread to do some work
相对于阻塞,像这样:
Thread newThread = new Thread(new ThreadStart(ThreadMethod));
newThread.Start()
while (!newThread.isAlive()) Thread.Sleep(1);
Thread.Sleep(1); // Allow the new thread to do some work
我非常强力测试(与周边调用DateTime.Ticks while循环)并没有真正显示任何东西(说在两种情况下差异是0滴答)。
线程创建过程是否足够短以至于旋转效率更高?或者大多数教程都建议旋转,因为它稍微更优雅,时间差异可以忽略不计?
的。一些资源(例如Windows消息队列)绑定到创建它们的线程,因此不能在ctor中分配 - 它们必须由新线程分配。如果ctor不等待新线程分配这些资源,那么线程可能会被要求执行一个将失败的动作,因为它尚未轮到分配资源。按照Dani的建议,将事件传递给线程是可以的。 – 2011-06-16 08:20:20