linq - 使用 Linq-to-XML 插入,带线程

标签 linq multithreading linq-to-xml

在编写时确保线程安全的 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 范围内捕获了大量电子邮件。只是想知道是否有更好的方法;或者,如果一开始就锁定它就太过分了。

最佳答案

以这种方式保存文件本质上不是线程安全的,因此使用静态锁句柄是明智的。

关于linq - 使用 Linq-to-XML 插入,带线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/567811/

相关文章:

android - 奇怪!!,Textview 值正在从后台线程更新

c# - 如何从Azure存储表中选择缺少字段的记录?

匿名类型中的 C# 方法初始化

c# - Linq查询如何从今天的日期中选择最后一周的数据

c# - 关于锁性能/使用的 2 个问题

linq - 更新 XDocument 中的 XElement 值?

c# - 如何使用 Entity Framework 7 linq 查询加载嵌套在类中的所有级别的对象?

java - Java ThreadGroup 对象是否绑定(bind)到单个 CPU?

c# - LINQ重构

c# - 在 XML 文档中查找重复的子节点