Параллельные коллекции предназначались для безопасного изменения самой коллекции ; не предметы . Вам нужно будет добавить свои собственные примитивы синхронизации в класс Cell
. Если внешний и внутренний экземпляры List
останутся без изменений, то нет необходимости применять к ним синхронизацию.
Вы упомянули, что у вас будет много читателей, но только один писатель. Это невероятно важная деталь. Это означает, что любые стратегии синхронизации без блокировки становятся значительно проще в реализации. Тем не менее, я не рекомендую идти по этому пути, так как все равно было бы довольно сложно получить права. Но это также может означать, что ReaderWriterLockSlim
может работать лучше, чем lock
.
Вам придется поэкспериментировать с обоими, чтобы увидеть, какой из них обеспечивает лучший баланс удобства обслуживания и эффективности. Я предполагаю, что вы обнаружите, что традиционный lock
будет работать быстрее, несмотря на наличие нескольких читателей и одного писателя, но это стоит проверить. Это, конечно, намного проще при наборе кода.
Вот пример кода для обоих.
public class Cell
{
private object m_LockObject = new object();
public object ReadMyState()
{
lock (m_LockObject)
{
// Return the data here.
}
}
public void ChangeMyState()
{
lock (m_LockObject)
{
// Make your changes here.
}
}
}
и
public class Cell
{
private ReaderWriterLockSlim m_LockObject = new ReaderWriterLockSlim();
public object ReadMyState()
{
m_LockObject.EnterReadLock();
try
{
// Return the data here.
}
finally
{
m_LockObject.ExitReadLock();
}
}
public void ChangeMyState()
{
m_LockObject.EnterWriteLock();
try
{
// Make your changes here.
}
finally
{
m_LockObject.ExitWriteLock();
}
}
}