1

在向字典添加密钥期间,如果我不锁定它并给出合理的 NullReferenceException,它就会崩溃

当我向字典值(列表引用)添加元素时,它很少会崩溃,这很奇怪......

我还有另一个问题。文件为文本格式。有时读取它们需要 1890 毫秒,有时则需要 10 倍。运行是连续的。是否有可能突然有东西忙于 I/O 缓冲区

任何建议至少稳定这一点......

        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);                
            }                                                       
        }

    }
4

1 回答 1

0

我会将添加移动到并行循环之外的字典中。这为您节省了一个lock(以额外的循环为代价),并使在并行处理之前检查字典的内容至少更加实用。

此外,这是您要并行完成的阅读,而不是添加到字典中。

于 2010-07-26T08:57:28.350 回答