3

我想问一下以下代码是否是线程安全的: 考虑 Save1 和 Save2 将同时执行。数据上下文的线程安全是否有问题?

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);
        }        
    }
}

提前致谢

4

2 回答 2

6

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

于 2012-10-23T19:14:28.790 回答
1

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

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

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

于 2012-10-23T19:35:04.760 回答