這不是關於我可以或應該以最佳方式利用隊列的不同方法,而是我看到的發生的事情對我來說毫無意義。C#線程和隊列
void Runner() {
// member variable
queue = Queue.Synchronized(new Queue());
while (true) {
if (0 < queue.Count) {
queue.Dequeue();
}
}
}
這是運行在一個單獨的線程:
var t = new Thread(Runner);
t.IsBackground = true;
t.Start();
其他事件是 「排隊」 荷蘭國際集團其他地方。我看到發生的事情經過一段時間後,Dequeue實際上會拋出InvalidOperationException,隊列爲空。這應該是不可能的,因爲計數如何保證那裏存在某些東西,而且我確信沒有其他東西是「出列」的。
的問題(S):
- 是否有可能入隊實際上增加了計數之前的產品完全隊列(這意味着什麼)?
- 是否有可能線程以某種方式在Dequeue語句處重新啓動(過期,重置......),但是在它已經移除了一個項目後立即重啓?
編輯(澄清):
這些碼片是一個實現背景輔助線程的包裝類的一部分。這裏的出隊隊列是唯一的出隊隊列,並且所有入隊/出隊隊列都在同步成員變量(隊列)上。
由於Ryan的回答......這是真正的代碼還是隻是一個簡單的例子?如果它是真正的代碼,你應該考慮改變循環 - 輪詢隊列而不是讓讀者與作者同步是一個糟糕的設計。您正在浪費數百萬個處理器週期來加熱房間。 – 2009-04-27 16:59:00
這是一個能夠解決問題的例子。那裏有一個Thread.Sleep,處理器沒有被敲打。我之所以選擇輪詢過程而不是同步讀/寫器,是因爲隊列幾乎總是有一些東西。在我們的主幹中,儘管我添加了一個AutoResetEvent來玩弄。 就像我在頂部所說的那樣,我並不擔心這裏的實現。這個線程模型似乎存在一個真正的問題,無論是對還是錯。 – neouser99 2009-04-27 17:23:49
從看你的代碼,你至少有主線程和你認爲Dequeue被調用的線程。爲什麼不給線程命名,並且每次調用Dequeue時,都使用堆棧跟蹤記錄線程的名稱。您可能會發現主線程中的某些內容會以您不期待的方式運行。 – 2009-04-27 19:11:38