Классы:Базовый замок вопрос в C#
public class SomeCollection
{
public void IteratorReset()
{
index = -1;
}
public bool IteratorNext()
{
index++;
return index < Count;
}
public int Count
{
get
{
return floatCollection.Count;
}
}
public float CurrentValue
{
get
{
return floatCollection[index];
}
}
public int CurrentIndex
{
get
{
return intCollection[index];
}
}
}
класса, который содержит ссылку на 'SomeCollection':
public class ThreadUnsafeClass
{
public SomeCollection CollectionObj
{
get
{
return collectionObj;
}
}
}
Классы ClassA
, ClassB
и ClassC
содержат следующий цикл, который перебирает CollectionObj:
for (threadUnsafeClass.CollectionObj.IteratorReset(); threadUnsafeClass.CollectionObj.IteratorNext();)
{
int currentIntIndex = threadUnsafeClass.CollectionObj.CurrentIndex;
float currentfloatValue = threadUnsafeClass.CollectionObj.CurrentValue;
// ...
}
Поскольку я всего лишь чтение CollectionObj в 3 классах, я использую многопоточность для ускорения, но я не совсем уверен, как обеспечить безопасность потоков. Я добавил блокировку в ThreadUnsafeClass при извлечении CollectionObj, но приложение выдает исключение вне диапазона.
Любая помощь приветствуется.
Спасибо!
Спасибо, Джон.Какое влияние оказывает возвращение нового объекта в GetEnumerator() на производительность, учитывая, что моя коллекция обычно очень большая, а секция цикла называется сотни тысяч раз? – alhazen
@alhazen: если коллекция очень велика, это будет * уменьшать * влияние создания дополнительного объекта, потому что вы не создаете его на каждой итерации всего один раз для всего цикла. Вы * можете * использовать тип значения, если вы действительно хотите, например 'List', но я определенно не буду этого делать, пока вы не узнаете, что у вас возникла проблема. –
Извините, что снова вас обманули. Я модифицировал 'SomeCollection' так, чтобы он реализовал' IEnumerable ', как вы предложили. В настоящее время GetEnumerator() возвращает 'floatListCollection.GetEnumerator()', но я не смог найти сообщение, которое описывает способ возврата нового объекта перечислителя для каждого вызова. Могу ли я использовать клонирование в этом случае? Благодарю. –
alhazen