SynchronizedList<T>
using System.Collections.Generic;
namespace System.Diagnostics
{
internal sealed class SynchronizedList<T>
{
private readonly List<T> _list;
private uint _version;
public int Count => _list.Count;
public SynchronizedList()
{
_list = new List<T>();
}
public void Add(T item)
{
lock (_list) {
_list.Add(item);
_version++;
}
}
public bool AddIfNotExist(T item)
{
lock (_list) {
if (_list.Contains(item))
return false;
_list.Add(item);
_version++;
return true;
}
}
public bool Remove(T item)
{
lock (_list) {
if (!_list.Remove(item))
return false;
_version++;
return true;
}
}
public void EnumWithFunc<TParent>(ActivitySource.Function<T, TParent> func, ref ActivityCreationOptions<TParent> data, ref ActivitySamplingResult samplingResult, ref ActivityCreationOptions<ActivityContext> dataWithContext)
{
uint version = this._version;
int num = 0;
while (num < this._list.Count) {
T item = default(T);
lock (this._list) {
if (version == this._version) {
item = this._list[num];
num++;
goto IL_004f;
}
version = this._version;
num = 0;
}
continue;
IL_004f:
func(item, ref data, ref samplingResult, ref dataWithContext);
}
}
public void EnumWithAction(Action<T, object> action, object arg)
{
uint version = _version;
int num = 0;
while (num < _list.Count) {
T arg2 = default(T);
lock (_list) {
if (version == _version) {
arg2 = _list[num];
num++;
goto IL_004f;
}
version = _version;
num = 0;
}
continue;
IL_004f:
action(arg2, arg);
}
}
}
}