書き込みのために、スレッドセーフな Linq-to-XML を保証する最良の方法は何ですか?
最近、Web クラスターが過負荷になり、サイトの応答性が向上したときに連絡できるように、overloaded.aspx をすぐに取り出さなければなりませんでした。私の短い5分間の速攻で、私はこれを書きました:
private static object LockHandle = new object();
protected override void OnLoad(EventArgs e)
{
SubmitButton.ServerClick += new EventHandler(SubmitButton_ServerClick);
base.OnLoad(e);
}
void SubmitButton_ServerClick(object sender, EventArgs e)
{
string email = Email.Value.Trim();
if (email.Length > 0)
{
Regex regex = new Regex(@"^([\w\-\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))$");
if (regex.IsMatch(email))
{
lock (LockHandle)
{
try
{
string fileName = Server.MapPath("emails.xml");
XDocument xdoc = XDocument.Load(fileName);
xdoc.Element("emails").Add(new XElement("email", email));
xdoc.Save(fileName);
}
catch {}
}
ResponseText.Text = "Thanks! We'll get back to you.";
}
}
}
Linq-to-XML がスレッドセーフであるかどうかを調べることができませんでした。そのため、理論は「静的オブジェクトをロックするだけで、複数の書き込みを防ぐことができます」というものになりました。これが最善のアプローチでしたか?それは必要でしたか (Linq-to-Xml スレッドセーフですか?)。悲しいことに、私の 2 冊の Pro LINQ と Linq in Action の本では、このテーマについて触れていません。
これは問題なく機能し、20 分間で過負荷になった量の電子メールをキャプチャしました。より良い方法があるかどうか疑問に思っています。または、そもそもロックするのがやり過ぎだった場合。