//I have collection
private static List<Sport> ChosenSports = new List<Sport>();
//and lock object for it
private static object _lockSports = new object();
//I have checkbox that add or remove collection items
private void CheckBoxSportZone_Checked(object sender, RoutedEventArgs e)
{
var chkZone = sender as CheckBox;
lock (_lockSports)
{
if (chkZone.IsChecked == true)
ChosenSports.Add(chkZone.DataContext as Sport);
else if (chkZone.IsChecked == false)
ChosenSports.Remove(chkZone.DataContext as Sport);
}
}
//And method that uses that collection
private IEnumerable<Sport> FilterSports(HashSet<Sport> sports)
{
lock (_lockSports)
return sports. Where(x => ChosenSports.Contains(x));
}
當我檢查複選框來過濾方法拋出ArgumentOutOfRangeException上改變總彙
類型「System.ArgumentOutOfRangeException」 未處理的異常出現在mscorlib.dll
其他信息:索引超出範圍。必須是非負數 且小於集合的大小。
看起來我在檢查收集時標記ChechBox。但是我使用鎖定關鍵字,所以它應該是安全的,不是嗎?
只是出於好奇...它的工作原理,如果你重構,所以你不要在你的鎖中使用lambda,也就是把它變成一個塊而不是一行,然後做一個循環來建立最終的集合? –