可以在这种情况下明智地使用Thread.Sleep(Timespan.Zero)吗?

Rob*_*vey 2 .net c# multithreading .net-3.5

我正在编写一个从文件中读取数据包的程序,并将每个数据包分配给指定的管道进行处理.每个管道对象都有一个阻塞队列和一个过滤器类.可以同时运行几个这样的管道.

阻塞队列只收集输入端的数据包,直到达到最大容量,此时它会阻塞Queue方法,直到过滤器Dequeue的某些数据包为止.阻塞队列是一个使用Monitor.Wait()Monitor.Pulse()进行同步的简单类.

每个过滤器都有一个Process()在自己的专用线程上执行的方法.它看起来像这样:

public void Process()
{
    while (!done)
    {
        var packet = sourceQueue.Dequeue();

        //  Perform some filtering operation on packet here

        targetQueue.Enqueue(sourceQueue);

        // Let other threads do some work
        Thread.Sleep(Timespan.Zero);
    }
}
Run Code Online (Sandbox Code Playgroud)

Thread.Sleep()以这种方式使用该方法可能存在哪些缺陷?

MSDN文档规定,使用Thread.Sleep(Timespan.Zero) "表示该线程应暂停允许其他等待线程来执行,"这是我想要的.

但是像这样的博客条目基本上表明使用Thread.Sleep是邪恶的.为什么?这是一个很好的用途Thread.Sleep,还是有更好的方法?

Jon*_*eet 5

如果您使用.NET 4,我会亲自使用Thread.Yield,以使其更清晰你想达到什么样的......但除此之外,你的睡眠看起来应该是好的,我...(模数的选择0或1,如其他地方所述)但你确定它确实是必要的吗?您是否进行了任何分析以检查它是否真的有帮助?让这个线程完成时间片的缺点是什么?

看起来你并不依赖于睡觉的正确性,这是Peter Ritchie博客文章的主旨,据我所知......这意味着它必须出于性能原因.与为了性能而进行的任何调整一样,无论是否有这种情况,都应该真正衡量性能,看看它是否真的值得.如有疑问,请使用更简单的代码:)