堆棧空異常
回答
您必須同步接入使用的東西時,像Stack<T>
。最簡單的方法是使用lock
,然後讓您使用lock
進行同步;所以流行將是:
int item;
lock (SharedMemory)
{
while (SharedMemory.Count == 0)
{
Monitor.Wait(SharedMemory);
}
item = SharedMemory.Pop();
}
Console.WriteLine(item);
,並推動將是:
lock (SharedMemory)
{
SharedMemory.Push(item);
Monitor.PulseAll(SharedMemory);
}
不會使用MBen建議的'ConcurrentStack
@codesparkle如果它有阻塞的'Pop'方法,也許;但事實並非如此。它只有「如果有東西在那裏,請給我一些東西」,又名'TryPop' –
這對我感謝兄弟:); –
how is that possible the stack is full & has 16 items??!
在多線程環境中,它是非常有可能的。
您的程序中是否使用了多個線程?如果是,SharedMemory
應在lock
之前進行任何更改。
...並在查詢之前! –
如果SharedMemory
是Stack
,並且因爲您正在使用多線程並且您正在使用.Net 4。你應該使用:ConcurrentStack
編輯
我的第一個編輯和Quartermeister這是一個簡單有效的解決方案有很大意見後:
int item;
var SharedMemory = new BlockingCollection<int>(new ConcurrentStack<int>());
// later in the Consume part
item = SharedMemory.Take(); // this will block until there is an item in the list
Console.WriteLine(item);
- 1. 空引用異常堆棧
- 2. 堆棧空間異常
- 3. 無底堆棧的空指針異常
- 4. 異常的空堆棧跟蹤
- 5. 堆棧展開異常C++
- 6. 堆棧溢出異常
- 7. 異常堆棧跟蹤
- 8. 堆棧溢出異常
- 9. VxWorks堆棧幀異常大
- 10. 堆棧溢出異常
- 11. 異常和堆棧跟蹤
- 12. Sammy.js異常堆棧跟蹤
- 13. 導致堆棧異常(x86)
- 14. 的Java空指針異常 - 堆棧跟蹤空
- 15. 調用堆棧上的異常處理堆棧幀的順序
- 16. checkAndLoadTargetData.Java堆空間異常
- 17. Java堆空間異常
- 18. 使用堆棧倒置隊列時出現空指針異常
- 19. 異常:使用context.Forward()和AuthBot時堆棧爲空?
- 20. 服務堆棧Hello World教程:異常EndpointHost.Config爲空
- 21. MPAndroidChart堆棧BarChart自定義Markerview空指針異常
- 22. C#WPF Window.ShowDialog堆棧溢出異常
- 23. 異常(堆棧跟蹤)在一行
- 24. 如何從異常「跳」到堆棧幀?
- 25. 異常向上傳播調用堆棧
- 26. 檢索異常全堆棧跟蹤
- 27. 異常java.lang.StackOverflowError:堆棧大小8MB
- 28. 沒有堆棧跟蹤異常
- 29. 之前堆棧溢出異常的main()
- 30. Control.EndInvoke重置調用堆棧異常
您已經標記了這個多線程所以我猜許多線程訪問該代碼。我也猜測'SharedMemory'不是線程安全的,而且你沒有鎖定它。我對嗎? – Rotem
在這種情況下'SharedMemory'是什麼?什麼是'全'? –
您的問題標題顯示「Stack empty」,您的第一句話顯示「Stack full」。這裏是什麼? –