我有我已經通過屬性是.NET的ObservableCollection <> ToList()線程安全嗎?如果沒有,如何進行
public ObservableCollection<ILog> Logs {get; private set;}
綁定到我的GUI有展現原木其他地方的一個子集的需求日誌的一個ObservableCollection,所以我有:
public ObservableCollection<ILog> LogsForDisplay
{
get
{
ObservableCollection<ILog> displayLogs = new ObservableCollection<ILog>();
foreach (Log log in Logs.ToList()) // notice the ToList()
{
if (log.Date != DateTime.Now.Day)
continue;
displayLogs.Add(log);
}
return displayLogs;
}
在我添加「ToList()」之前,我偶爾偶爾會遇到有關「集合被修改;枚舉操作可能不會執行」的異常「有道理 - 有人可以在我迭代時添加到日誌。我從Collection was modified; enumeration operation may not execute得到了「ToList」的想法,這似乎表明ToList是要走的路,並暗示它是線程安全的。但是ToList()線程安全嗎?我假設內部它必須使用列表並迭代它?如果有人在同一時間添加到該列表中呢?僅僅因爲我沒有看到問題並不意味着沒有問題。
我的問題。 ToList()線程安全,如果不是,保護日誌的最佳模式是什麼?如果ToList()是線程安全的,那麼你有參考嗎?
獎金問題。如果需求發生變化,並且我需要在GUI上顯示的所有內容都是LogsForDisplay和Not Logs,那麼是否可以將Logs更改爲可以解決問題的其他內容?如ImmutableList?然後,我不必打電話給ToList <>,我認爲需要一些時間才能製作副本。
讓我知道我是否可以提供澄清。 謝謝,
戴夫
[documentation](https://msdn.microsoft.com/en-us/library/ms668604%28v=vs.110%29.aspx)不保證任何有用的方法或屬性是線程安全的,因此你必須假設他們都不是。您可以在日誌記錄方法(您正在添加到「日誌」集合中)和「ToList」周圍尋找'lock'。這似乎只能解決這個問題。可能覆蓋派生於ObservableCollection的類中的所有插入等方法,以使用['SyncRoot']進行鎖定(https://msdn.microsoft.com/zh-cn/library/bb353794(v = vs.110).aspx )財產。 – slawekwin
所有好的答案,我感謝大家!只能遺憾地選擇1個。 – Dave