Почему происходит сбой в словаре, если я уверен, что синхронно обращаюсь к различным ссылкам на значения? - PullRequest
1 голос
/ 26 июля 2010

При добавлении ключа в словарь происходит сбой, если я не блокирую его и выдает разумное исключение NullReferenceException

Редко иногда также происходит сбой при добавлении элемента в значение словаря), что странно ...

У меня есть еще один вопрос.Файлы в текстовом формате.Иногда их чтение занимает 1890 мс, а иногда - в 10 раз больше.Пробеги сделаны последовательно.Есть ли вероятность, что что-то внезапно загружает буфер ввода-вывода

Любая рекомендация хотя бы стабилизировать это ...

        private static void ParallelReadAndCalculate(FileInfo[] files)
    {
        Stopwatch sw1 = Stopwatch.StartNew();
        while (!Parallel.ForEach(files, (FileInfo file) => ReadFileToEnd(file)).IsCompleted) ;
        Console.WriteLine(sw1.ElapsedMilliseconds);
    }

        private static void ReadFileToEnd(FileInfo file)
    {
        string key = file.Name.Split('.')[0];
        lock (ListOfCompanyData)
            if (!ListOfCompanyData.ContainsKey(key))
            {
                ListOfCompanyData.Add(key, new List<string>(19800));
            }
        string line = "";

        using (StreamReader streamReader = (new StreamReader(file.FullName)))
        {                
            while ((line = streamReader.ReadLine()) != null) {
              // this is giving KeyNotFoundException sometimes and others, do I need to lock here given the fact that I am accessing different references synchronously
                    ListOfCompanyData[key].Add(line);                
            }                                                       
        }

    }

1 Ответ

0 голосов
/ 26 июля 2010

Я бы переместил добавление в словарь за пределы параллельного цикла.Это экономит lock (за счет дополнительного цикла) и делает по крайней мере более практичным проверку содержимого словаря перед параллельной обработкой.

Кроме того, вы хотите параллельно выполнять чтение, а не добавление в словарь.

...