C# LINQ到SQL是线程安全的吗?

C# LINQ到SQL是线程安全的吗?,c#,linq-to-sql,C#,Linq To Sql,我有一个接收和处理消息的服务器。然后它调用一个方法,该方法使用LINQtoSQL将消息添加到数据库中。当消息传入时,它们被设置到单独的线程上进行处理,因此可能会有两个线程同时调用我的SQL方法 我很好奇LINQtoSQL是否会为调用该方法的每个线程创建单独的数据上下文,或者上下文是否是静态的。我还想知道在调用SubmitChanges()之前是否应该放置一个线程锁 我认为这个问题很简单,但我会添加一个代码片段,以防万一 using (MyDataContext db = new MyDataCo

我有一个接收和处理消息的服务器。然后它调用一个方法,该方法使用LINQtoSQL将消息添加到数据库中。当消息传入时,它们被设置到单独的线程上进行处理,因此可能会有两个线程同时调用我的SQL方法

我很好奇LINQtoSQL是否会为调用该方法的每个线程创建单独的数据上下文,或者上下文是否是静态的。我还想知道在调用SubmitChanges()之前是否应该放置一个线程锁

我认为这个问题很简单,但我会添加一个代码片段,以防万一

using (MyDataContext db = new MyDataContext(args.ConnectionText))
            {
                //  Remove records with matching iprocid and atype
                IQueryable<densgrd> rows = from grades in db.densgrds
                                           where grades.iprocid == args.DensGrd.iprocid &&
                                                 grades.atype == args.DensGrd.atype
                                           select grades;
                //  Remove any results from the database.
                foreach (densgrd remove in rows)
                {
                    db.densgrds.DeleteOnSubmit(remove);
                }
                db.densgrds.InsertOnSubmit(args.DensGrd);

                db.SubmitChanges();
            }
使用(MyDataContext db=newmydatacontext(args.ConnectionText))
{
//删除具有匹配iprocid和atype的记录
IQueryable rows=来自以db.densgrds为单位的坡度
其中grades.iprocid==args.DensGrd.iprocid&&
grades.atype==args.DensGrd.atype
选择等级;
//从数据库中删除任何结果。
foreach(丹斯格德成排移除)
{
db.densgrds.deleteosubmit(删除);
}
db.densgrds.InsertOnSubmit(args.DensGrd);
db.SubmitChanges();
}

本身就是linq到sql线程安全的,绝对不是

您在问题中发布的代码中使用linq to sql的方式是线程安全的,


每个线程都有自己的
MyDataContext
副本,因为您正在使用它的线程内创建变量(这是您应该做的)线程之间不共享变量,您可以运行任意数量的变量,而无需执行任何类型的锁定。

每个线程将分别执行
new MyDataContext
,因此,它们将各自获得自己的上下文。就像您要使IQueryable对象成为一个类的成员变量,然后在该类上公开一个执行IQueryable对象的方法,然后从多个线程调用该方法一样,您可能会遇到麻烦