我正在寫一個程序,它從文件中讀取數據包,並將每個數據包分配到指定的管道進行處理。每個管道對象都有一個阻塞隊列和一個過濾器類。可以同時運行多條這樣的管道。Thread.Sleep(Timespan.Zero)可以在這種情況下使用嗎?
阻塞隊列只是在輸入端收集數據包,直到它達到最大容量,此時它會阻塞隊列方法,直到過濾器出隊的某些數據包。阻塞隊列是一個簡單的類,它使用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);
}
}
什麼以這種方式使用Thread.Sleep()
方法的可能的陷阱?
的MSDN documentation規定,使用Thread.Sleep(Timespan.Zero)
「表示該線程應暫停允許其他等待線程來執行,」這是我想要的。
但是有博客條目like this one基本上說使用Thread.Sleep
是邪惡的。爲什麼?這是一個很好的使用Thread.Sleep
,還是有更好的方法?
是不是信號燈精確設計你提到的能力的情況呢? – Mehrdad 2011-06-05 22:03:48
@Mehrdad:我不知道。 MSDN文檔說Semaphore「控制對資源池的訪問」。 'ThreadPool'不會完成同樣的事情嗎? – 2011-06-05 22:11:32
我的意思是信號量對有多少線程可以訪問資源有一個上限,如果我理解正確的話就是你在這裏做的,對嗎? – Mehrdad 2011-06-05 22:15:13