マルチスレッド環境では、この拡張メソッドはスレッドセーフですか?は、C#拡張メソッドのスレッドセーフを使用してXElement値を読み取っていますか?
class Program
{
public static object lockObject = new object();
static void Main(string[] args)
{
List<Student> studentCollection = new List<Student>();
string xml = "<root>";
xml += "<student><name>stud1</name><address>street1</address></student>";
xml += "<student><name>stud2</name><address>street2</address></student>";
xml += "<student><name>stud3</name><address>street3</address></student>";
xml += "</root>";
Parallel.For(0, 10000, index =>
{
XElement xmlElement = XElement.Parse(xml);
var students = xmlElement.Descendants("student").ToList();
students.ForEach(student =>
{
Student stud = new Student();
stud.Name = student.GetValue("name");
stud.Address = student.GetValue("address");
lock (lockObject)
{
studentCollection.Add(stud);
}
});
});
}
}
public static class Extension
{
public static string GetValue(this XElement xelement, string tagName)
{
var ele = xelement;
if (ele != null && ele.Element(tagName) != null)
{
// I assume this as unsafe code.
return ele.Element(tagName).Value;
}
return string.Empty;
}
}
なぜあなたはそうではないと思いますか? – Rahul
xelementが変更できる場合は、いいえ。それができない場合は、はい。両方のケースをスレッドセーフにするには、ele.Element(tagName)を変数に保存し、それを使用します。 – Euphoric
Euphoricのコメントを拡張するには、C#6を使用する場合、メソッドを次のように書き換えます。 'return ele?.Element(tagName)?Value ?? string.Empty; ' スレッドセーフでもあります('? '演算子はnullチェックや使用前にテンポラリ変数にそのオペランドを格納します) –