LockableList
LockableList<Key, Value> wraps a list into lockable list.
List<string> list = new List<string>();
LockableList<string> lockableList = new LockableList<string>(list);
LockableList.Create(elementType, internalList) creates a list for element type argument.
List<string> list = new List<string>();
var locakableList = LockableList.Create(typeof(string), list);
LockableList.Create(elementType) creates a list for element type with default internal list.
IList list = LockableList.Create(typeof(String));
If internal list is not provided in constuctor, a default list is created.
// Create list
var list = new LockableList<string> { "Value1", "Value2" };
.SetReadOnly() extension method of IReadOnly locks list.
list.SetReadOnly();
After locking write operation throws InvalidOperationException.
try
{
list.Add("Value3");
}
catch (InvalidOperationException)
{
}
If internal list is not internally synchronized, then it must be externally locked with its .SyncRoot in concurrent use.
// Create non-internally synchronized list
var list = new LockableList<int>();
// Is underlying map internally synchronized
WriteLine(list.IsSynchronized); // False
// Add concurrently
Parallel.For(0, 10, (int i) => { lock (list.SyncRoot) list.Add(i); });
// Lock
list.SetReadOnly();
// Print values
WriteLine(string.Join(',', list)); // 8,7,5,0,4,6,9,1,3,2
When internal list is internally synchronized, then values can be added concurrently without lock.
// Create internal list (internally synchronized)
var internalList = new ArrayList<int>();
// Create wrapper
var list = new LockableList<int>(internalList);
// Is underlying map internally synchronized
WriteLine(list.IsSynchronized); // True
// Add concurrently
Parallel.For(0, 10, (int i) => list.Add(i));
// Lock
list.SetReadOnly();
// Print values
WriteLine(string.Join(',', list)); // 0,1,4,5,3,7,8,2,6,9
Full Example
Full example
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using Avalanche.Utilities;
using static System.Console;
public class lockablelist
{
public static void Run()
{
{
// <01>
List<string> list = new List<string>();
LockableList<string> lockableList = new LockableList<string>(list);
// </01>
}
{
// <02>
List<string> list = new List<string>();
var locakableList = LockableList.Create(typeof(string), list);
// </02>
}
{
// <03>
IList list = LockableList.Create(typeof(String));
// </03>
}
{
// <04>
// Create list
var list = new LockableList<string> { "Value1", "Value2" };
// </04>
// <05>
list.SetReadOnly();
// </05>
// <06>
try
{
list.Add("Value3");
}
catch (InvalidOperationException)
{
}
// </06>
}
{
// <11>
// Create non-internally synchronized list
var list = new LockableList<int>();
// Is underlying map internally synchronized
WriteLine(list.IsSynchronized); // False
// Add concurrently
Parallel.For(0, 10, (int i) => { lock (list.SyncRoot) list.Add(i); });
// Lock
list.SetReadOnly();
// Print values
WriteLine(string.Join(',', list)); // 8,7,5,0,4,6,9,1,3,2
// </11>
}
{
// <12>
// Create internal list (internally synchronized)
var internalList = new ArrayList<int>();
// Create wrapper
var list = new LockableList<int>(internalList);
// Is underlying map internally synchronized
WriteLine(list.IsSynchronized); // True
// Add concurrently
Parallel.For(0, 10, (int i) => list.Add(i));
// Lock
list.SetReadOnly();
// Print values
WriteLine(string.Join(',', list)); // 0,1,4,5,3,7,8,2,6,9
// </12>
}
}
}