c#并行.ForEach用于替换文件文本时会引入竞争条件

本文关键字:竞争 条件 文本 ForEach 并行 用于 替换 文件 | 更新日期: 2023-09-27 18:04:07

以下代码块在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);
    });

?

c#并行.ForEach用于替换文件文本时会引入竞争条件

是的,存在竞争条件

fileText = fileText.Replace(guidObj.Value.OldGuid, guidObj.Value.NewGuid);

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