【问题标题】:LINQ To SQL Thread SafetyLINQ To SQL 线程安全
【发布时间】:2012-10-23 19:09:21
【问题描述】:

我想问一下下面的代码是否是线程安全的: 考虑 Save1 和 Save2 将同时执行。 datacontext的线程安全有没有问题?

public class Test1()
{
    private void Save1()
    {        
        using(TestLinqToSQL obj = new TestLinqToSQL())
        {        
             obj.SaveRecord(new Client (){Id = 1, Name = "John Doe");
        }
    }

    private void Save2()
    {        
         using(TestLinqToSQL obj = new TestLinqToSQL())
         {        
             obj.SaveRecord(new Client (){Id = 2, Name = "Mike Tyson");
         }
    }         
}



public class TestLinqToSQL : IDisposable
{
    public void SaveRecord(Client newClient)
    {
        using(ClientDatacontext cont = new ClientDatacontext())
        {
            cont.InsertRecord(newClient);
        }        
    }
}

提前致谢

【问题讨论】:

标签: c# multithreading linq-to-sql thread-safety datacontext


【解决方案1】:

在这种情况下,不,这不是问题,因为每个线程都会获得一个单独的 DataContext 实例,因为每个方法都会导致创建一个新实例。如果 DataContext 在线程之间共享,您会遇到问题,因为实例方法不是线程安全的see MSDN

【讨论】:

  • 我不会说“潜在”,这几乎可以保证是一个大问题。
  • 谢谢。实例方法是什么意思?
  • DataContext 类上的方法只有在你创建了一个之后才能访问。换句话说,方法不是静态的。
【解决方案2】:

Thread safe doesn't really mean anything without context。您需要更详细地了解您认为可接受和不可接受的内容。在您的特定情况下,因为您对每种方法都有单独的数据上下文,所以您不必担心其中一个插入“在”另一个插入“中间”,或者以其他方式导致其中一个完全失败由于对共享资源的不同步访问(如果数据上下文在线程之间共享,这可能会成为问题)。

但是,插入的顺序是完全不确定的。如果这些操作的顺序很重要,那么它就是“非线程安全的”。

此外,如果您正在执行包含“事务”的多个操作,则它可能是“线程安全”的,也可能不是“线程安全的”,具体取决于您如何定义线程安全。如果每个方法都插入 5 个项目,您无法确定所有五个插入在另一个方法的插入之前或之后(除非您明确添加 lock 以确保这一点)。

【讨论】:

  • 谢谢。这解决了我的情况。我不在乎插入顺序。
猜你喜欢
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 2010-12-21
  • 2011-06-22
相关资源
最近更新 更多