如何确保线程安全的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是否线程安全)? 遗憾的是,我的两本Pro LINQ和Linq in Action书籍都没有涉及到这个主题。
这种方法很有效,在我们超载的20m中捕获了大量电子邮件。只是想知道是否有更好的方法;或者,如果一开始就锁定它是否过度处理了。