Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Linq到XML插入,带有线程_Linq_Multithreading_Linq To Xml - Fatal编程技术网

使用Linq到XML插入,带有线程

使用Linq到XML插入,带有线程,linq,multithreading,linq-to-xml,Linq,Multithreading,Linq To Xml,对于编写,确保线程安全的Linq到XML的最佳方法是什么 最近,我们的网络集群超载了,我不得不快速拿出一个重载的.aspx来捕获电子邮件,当网站变得更具响应性时,人们可以联系到这些电子邮件。在短短5分钟的匆忙中,我写道: private static object LockHandle = new object(); protected override void OnLoad(EventArgs e) { SubmitButton.ServerClick += new EventHand

对于编写,确保线程安全的Linq到XML的最佳方法是什么

最近,我们的网络集群超载了,我不得不快速拿出一个重载的.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.";


    }
  }
}
我无法查找LINQtoXML是否是线程安全的;因此,理论是“让我锁定一个静态对象,这样可以防止多次写入。”这是最好的方法吗?甚至需要它吗(Linq到Xml是线程安全的吗?)。遗憾的是,我的两本《林克职业》和《林克行动》的书没有涉及到这个话题


这很好,我们在2000万的超负荷时间内捕获了大量电子邮件。只是想知道是否有更好的方法;或者,如果一开始就锁定它是一种过分的做法。

一般来说,在MSDN上,如果类型或非静态成员没有显式标记为线程安全,那么它就不是。一般来说,静态成员应该是静态的

假设微软自己的指导方针得到了遵守

但是,您似乎希望在执行加载/编辑/保存组时保护文件不被更改。只有在维护锁的情况下,这才是线程安全的(如果直接创建具有适当读/写功能的FileStram,然后将其(使用StreamReader或StreamWriter包装器)传递给Load和Save方法,这就很容易了)


仅使用锁的缺点是,如果文件被锁定,文件打开方法(包括在对象构造时隐式调用的方法)将引发异常。因此,您可能需要一个锁来避免这种情况(如果涉及多个进程或应用程序域,则可能需要一个互斥锁)。

我猜LINQ对象遵循与任何.Net SDK对象相同的线程安全准则:

  • 对静态方法的调用不需要跨线程同步
  • 对同一实例对象的调用应跨线程同步

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

我的想法是不希望其他写入失败,而是等待轮到它们写入同一文件。我的想法是,通过创建一个静态对象并锁定它,这将阻止所有其他线程写入(在同一名称空间中,是的)。是否?s/命名空间/应用程序域/和是。但这是关于文件和并发性,而不是XDocument。加载/操作/保存列表也会遇到同样的问题。是的,就是这样。除非有问题,否则总是“猜测”。所以我走这条路。呵呵。也许我应该说“期待”而不是“猜测”。当您在系统名称空间中使用组件时,这是理所当然的。