C# Parallel.ForEach 在用于替换文件文本时是否会引入竞争条件?
Does C# Parallel.ForEach introduce a race condition when used to replace file text?
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);
});
?
是的,存在竞争条件。
fileText = fileText.Replace(guidObj.Value.OldGuid, guidObj.Value.NewGuid);
如果两个单独的线程启动此操作,它们都将从原始字符串开始。无论哪个先完成,都将写入 fileText
变量。当第二个完成时,它也会写入同一个变量。但是由于两个线程都在对原始字符串进行操作,当第二个线程完成时,第一个线程所做的更改将被覆盖。
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);
});
?
是的,存在竞争条件。
fileText = fileText.Replace(guidObj.Value.OldGuid, guidObj.Value.NewGuid);
如果两个单独的线程启动此操作,它们都将从原始字符串开始。无论哪个先完成,都将写入 fileText
变量。当第二个完成时,它也会写入同一个变量。但是由于两个线程都在对原始字符串进行操作,当第二个线程完成时,第一个线程所做的更改将被覆盖。