我创建这个特定的集合类:使自定义的C#集合线程安全
public class RangeObservableCollection<T> : ObservableCollection<T>
{
private bool _suppressNotification = false;
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
try
{
if (!_suppressNotification)
base.OnCollectionChanged(e);
}
catch
{
}
}
public void AddRange(IEnumerable<T> list)
{
if (list == null) {
return ;
}
_suppressNotification = true;
foreach (T item in list)
{
Add(item);
}
_suppressNotification = false;
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
public void EditElement(int index, object value)
{
_suppressNotification = true;
if (index >= 0 && index < this.Count) this[index] = (T)value;
_suppressNotification = false;
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
public void RemoveElementAt(int index)
{
_suppressNotification = true;
if (index >= 0 && index < this.Count) this.RemoveAt(index);
_suppressNotification = false;
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
public void RemoveElement(T element)
{
_suppressNotification = true;
this.Remove(element);
_suppressNotification = false;
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
}
然后我想用这样的:
public RangeObservableCollection<vue_medecin > MedecinGDP { get; set; }
public RangeObservableCollection<gdp_groupe > CodeGDP_Collection { get; set; }
public RangeObservableCollection<fsign_fiche > FiltredParticipant { get; set; }
private async Task FillList()
{
await Task.Factory.StartNew(() =>
{
gdpList = SimpleIoc.Default.GetInstance<ICrud<gdp_groupe>>().GetAll().ToList();
MedecinGDP.AddRange(SimpleIoc.Default.GetInstance<ICrud<vue_medecin>>().GetAll());
CodeGDP_Collection.AddRange(gdpList);
FiltredParticipant.AddRange(SimpleIoc.Default.GetInstance<ICrud<fsign_fiche>>().GetAll());
});
}
我想定制RangeObservableCollection
到使它成为线程安全的,因为在我的情况下,主线程和任务之间的并发访问可能会导致问题。
我想避免使用并发集合(如回答here),因为我必须在我的程序中使用此集合类型。
那么,我该如何编辑这个实现来完成这个任务?最好的主意是什么?
感谢,
当你说“线程安全”时,你究竟想要达到什么目的?你想同时修改集合吗?你想在另一个线程写入集合时能够使用IEnumerable吗?取决于你想要发生的事情会影响你需要做的事情。 – 2015-04-02 14:57:02
@ScottChamberlain我的意思是我希望能够使用IEnumerable而另一个线程写入它 – 2015-04-02 14:58:56
为什么这个集合需要关注这个?很可能你只需要这种类型的用户同步他们的访问权限,而不是让这个集合尝试管理它。 – Servy 2015-04-02 15:02:08