簡體   English   中英

當多個線程以相同的時滯將數據插入列表時,C#OutOfMemoryException

[英]C# OutOfMemoryException when multiple threads are inserting data into a list with same time lag

當線程(幾乎同時啟動)在插入數據之前固定且固定的時間休眠時,發生了一個奇怪的現象。 但是,如果它們每個人在插入數據之前都睡了一個隨機的時間,那么不會發生有關內存的異常。 這重復發生。

每次崩潰時,該列表最多包含2000個項目(每個項目只有10個字節)。 這似乎沒有超出內存限制。

如果每個線程都這樣睡覺:

Thread.Sleep((int)((new Random(DateTime.Now.Second)).NextDouble() * 10000));

如果睡眠時間相同且固定,它不會使應用程序崩潰:

Thread.Sleep(6000);

它會崩潰。

更新:抱歉,信息不完整,感謝您的回答。 我在編輯列表時(無論何時何地)都擁有一個儲物櫃。

我用真正耗時的工作(顯然是用不同的完成時間)代替了“睡覺”,OutOfMemory異常再也沒有發生。

因此,這是一個抽象的問題:一些線程(大約30個)在同一時間(幾乎)啟動並睡眠相同的時間,然后在同一時間(幾乎)使用一個列表(帶有鎖)進行操作。 它將導致OutOfMemoryException。 但是,如果讓它的同步性降低(睡眠/做不同時間的工作),那就可以了。

是的,同時性很高會引起一些問題,但是為什么內存不足? 只有30個線程,每個線程僅將幾個字節更新到一個列表中。 謝謝。

抱歉,堆棧跟蹤信息丟失。 :(

問題是多個線程同時訪問同一元素,這會導致不可預測的錯誤。 要同步線程,請嘗試此

lock(yourListObject)
{
   yourListObject.InsertData(data);
}

編輯:您應該看看鎖語句

您使用的列表類型不是線程安全的。 您可以使添加和訪問代碼線程安全,也可以使用線程安全列表類型。 沒有代碼(類型),很難說出應該做什么。

顯然,當所有線程嘗試同時更新列表時,插入代碼中會引起較高的內存負載。 也許一些鎖定機制? 還是嘗試將數據插入可能鎖定的資源的任何遞歸或循環?

嘗試使用ConcurrentBag而不是List來查看您的問題是否來自列表上的並發訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM