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,还是有更好的方法?
如果您使用.NET 4,我会亲自使用Thread.Yield,以使其更清晰你想达到什么样的......但除此之外,你的睡眠看起来应该是好的,我...(模数的选择0或1,如其他地方所述)但你确定它确实是必要的吗?您是否进行了任何分析以检查它是否真的有帮助?让这个线程完成时间片的缺点是什么?
看起来你并不依赖于睡觉的正确性,这是Peter Ritchie博客文章的主旨,据我所知......这意味着它必须出于性能原因.与为了性能而进行的任何调整一样,无论是否有这种情况,都应该真正衡量性能,看看它是否真的值得.如有疑问,请使用更简单的代码:)
| 归档时间: |
|
| 查看次数: |
700 次 |
| 最近记录: |