当C#Parallel.ForEach用于替换文件文本时会引入竞争条件吗?

dev*_*ost 1 c# replace race-condition parallel.foreach

C#中的以下代码块是否引入了竞争条件:

    Parallel.ForEach(guidDictionary, (dictionaryItem) =>
    {
        var fileName = dictionaryItem.Key;
        var fileText = File.ReadAllText(fileName, Encoding.ASCII);
        Parallel.ForEach(guidDictionary, (guidObj) =>
        {
            fileText = fileText.Replace(guidObj.Value.OldGuid, guidObj.Value.NewGuid);
        });

        File.WriteAllText(fileName, fileText);
    });
Run Code Online (Sandbox Code Playgroud)

Eri*_*rik 7

是的,有竞争条件.

fileText = fileText.Replace(guidObj.Value.OldGuid, guidObj.Value.NewGuid);
Run Code Online (Sandbox Code Playgroud)

如果两个单独的线程开始此操作,它们都将从原始字符串开始.无论哪个先完成,都会写入fileText变量.当第二个完成时,它也将写入同一个变量.但由于两个线程都在原始字符串上运行,当第二个线程完成时,第一个线程所做的更改将被覆盖.

  • 看起来所有文件名都是唯一的,因为他正在迭代字典的键.标准.Net字典限制键是唯一的. (2认同)