using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Threading.Tasks;
public static void Main()
TestContainer(new Container2());
TestContainer(new Container1());
private static void TestContainer(IContainer container)
Parallel.For(0, 100, _ =>
var objects = container.GetAsync().GetAwaiter().GetResult().ToList();
Console.Write(" " + objects.Count.ToString());
private interface IContainer
Task<IEnumerable<object>> GetAsync();
private sealed class Container1 : IContainer
private readonly object lockObject = new object();
private readonly List<Wrapper> list = new List<Wrapper>();
this.list.Add(new Wrapper(new object()));
public Task<IEnumerable<object>> GetAsync()
return this.list.Select(wrapper => wrapper.WrappedObject);
private sealed class Container2 : IContainer
private readonly ConcurrentBag<Wrapper> bag = new ConcurrentBag<Wrapper>();
this.bag.Add(new Wrapper(new object()));
public Task<IEnumerable<object>> GetAsync()
return this.bag.Select(wrapper => wrapper.WrappedObject);
private sealed class Wrapper
public Wrapper(object wrappedObject)
this.WrappedObject = wrappedObject;
public object WrappedObject { get; }