0

У меня есть два метода получения элемента по ключу :

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 в обоих случаях, второй меня привлекает гораздо больше, но вопрос, насколько он безопасен?

  • 2
    ConcurrentDictionary - потокобезопасная коллекция, потому вытаскивать из неё элемент - потокоюбехопасно. А вот увеличивать какой то ваш счетчик _index++ без какой-либо синхронизации потокобазопасным не назвать. – tym32167 Feb 25 '19 at 15:58
  • т.е. первый метод более удачный? Есть ли у вас какая-либо идея как сделать это более изящно? я ничего не придумал за два- три часа. – Tetsua Keito Feb 25 '19 at 18:14
  • Что думаете над тем. что бы использовать нечто подобное? https://docs.microsoft.com/en-us/dotnet/api/system.threading.interlocked.increment?redirectedfrom=MSDN&view=netframework-4.7.2#System_Threading_Interlocked_Increment_System_Int32__ – Tetsua Keito Feb 25 '19 at 18:18
  • по тому куску кода, что вы показали, ничего не ясно, ни для чего эта структура данных, ни что у ней внутри есть, ни для чего этот index нужен, потому ничего сказать не могу. – tym32167 Feb 25 '19 at 18:28
  • делаю gzip многопоточный, который блоками архивирует и так далее) – Tetsua Keito Feb 25 '19 at 18:31
  • и вы все блоки просто в памяти держите? – tym32167 Feb 25 '19 at 18:39
  • да, по крайней мере я так понял, это требуется в задании, если памяти не хватает, бросать ексепшен. Ну, я так понимаю. – Tetsua Keito Feb 25 '19 at 18:51
  • ок, но вот это вам для чего ConcurrentDictionary? И что за index и для чего он? Что вообще этот ваш класс делает, откуда вы методы показали? – tym32167 Feb 25 '19 at 19:05
  • Это, по идее Consumers по паттерну.Producer/Consumers, предполагалось что здесь вся логика добавления и удаления из очереди/словаря. – Tetsua Keito Feb 25 '19 at 19:39
  • В очередь я помещаю блоки, на которые разбил файл. В словарь же, помещаю вытащенные из очереди данные , по типу [блок,значение] – Tetsua Keito Feb 25 '19 at 19:43
  • И что за index и для чего он? – tym32167 Feb 25 '19 at 19:51
  • пробежаться по всем блокам словаря. – Tetsua Keito Feb 25 '19 at 20:23
  • чтобы пробежаться по всем блокам, у словаря есть Values, вам не нужен для этого индекс. – tym32167 Feb 25 '19 at 20:40

0 Answers0