У меня есть два метода получения элемента по ключу :
private ConcurrentDictionary<int, byte[]> _dictionary = new ConcurrentDictionary<int, byte[]>();
private bool _completed = false;
Первый :
public bool TryGetValueByKey(out byte[] data)
{
lock (_writingLocker)
{
while (!_writingDictionary.ContainsKey(_index))
{
if (_completed)
{
data = new byte[0];
return false;
}
Monitor.Wait(_writingLocker);
}
data = _writingDictionary[_index++];
Monitor.PulseAll(_writingLocker);
return true;
}
}
public void SetCompleted()
{
lock (_writingLocker)
{
_completed = true;
Monitor.PulseAll(_writingLocker);
}
}
Второй :
public bool GetValueByKey(out byte[] data) => _dictionary.TryGetValue(_index++, out data);
Используется ConcurrentDictionary в обоих случаях, второй меня привлекает гораздо больше, но вопрос, насколько он безопасен?
ConcurrentDictionary- потокобезопасная коллекция, потому вытаскивать из неё элемент - потокоюбехопасно. А вот увеличивать какой то ваш счетчик_index++без какой-либо синхронизации потокобазопасным не назвать. – tym32167 Feb 25 '19 at 15:58ConcurrentDictionary? И что за index и для чего он? Что вообще этот ваш класс делает, откуда вы методы показали? – tym32167 Feb 25 '19 at 19:05И что за index и для чего он?– tym32167 Feb 25 '19 at 19:51Values, вам не нужен для этого индекс. – tym32167 Feb 25 '19 at 20:40