簡體   English   中英

C#Collection在lambda.where上被修改了異常

[英]C# Collection was modified exception on lambda.where

我有以下代碼:

var actionsToExecute = _messagesToExecute.Where(m => m.CanExecute).ToList();

它在99%的時間內運行良好,但每隔一段時間就會崩潰,但異常:

Collection was modified; enumeration operation may not execute

我有點失落,因為它似乎有點隨機。 這是該方法的第一行。 什么可能導致lambda表達式拋出此異常?

它與線程有關。 看來這是網站代碼。 如果在執行.ToList()的同時訪問該站點的另一個人修改了該私有變量,則該異常將發生。

解決方案是使用線程安全集合,但這不是最佳的,因為如果許多人正在閱讀/寫入它們,他們一次只能或多或少地執行一次。

我有一個類似的問題,但枚舉並不重要,可以跳過或重復,所以我實現了自己的枚舉器,不檢查它是否被修改。

您需要在所有對_messagesToExecute的引用周圍使用lock(),或者您可以使用System.Collections.Concurrent中的內容來處理內部鎖定集合。

例如

_messagesToExecute = new ConcurrentBag<TMessage>();

或者如果您更願意使用鎖定:

static readonly object m_lock = new object();

然后每當你更新列表時:

lock(m_lock){
  _messagesToExecute.Add(item);
}

當你拿出清單時:

lock(m_lock){
    var actionsToExecute = _messagesToExecute.Where(m => m.CanExecute).ToList();
}

暫無
暫無

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

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