ObjectContext实例已被释放,不能再用于需要连接的操作

时间:2016-01-14 11:57:19

标签: entity-framework linq

这是一个需要两个List<int>并在数据库中更新相应表的函数。当我使用线程 T1 T2 运行这两个函数时,它会在第二个foreach循环中显示异常:

  

&#34; ObjectContext实例已被处理,不再可以   使用&#34;

我已经使用了像

这样的查询
var res = ctx.EmailDBs.Include(x => x.EmailDBid == id);

但它没有用。 在两种方法执行之前,请分享一些内容以保持ctx连接。

 public static void UpdateEmail(List<int> invalidEmailToUpdate, List<int> validEmailToUpdate)
 {
     using (OnliveMTAEntities ctx = new OnliveMTAEntities())
     {

         Thread T1, T2;

         T1 = new Thread(() =>
         {
             foreach (int id in invalidEmailToUpdate)
             {
                 var res = ctx.EmailDBs.FirstOrDefault(x => x.EmailDBid == id);
                 res.Status = 6;
             }
         });

         T1.Start();
         Thread.Sleep(100);

         T2 = new Thread(() =>
         {
             foreach (int id in validEmailToUpdate)
             {
                 var res = ctx.EmailDBs.FirstOrDefault(x => x.EmailDBid == id);
                 res.Status = 7;
             }
         });

         T2.Start();

         ctx.SaveChanges();
     }
 }

1 个答案:

答案 0 :(得分:0)

您需要等到线程 T1 T2 完全完成。只有这样你才能保存dataContext ctx.SaveChanges();

为此目的,方法称为 Join()MSDN)。像这样使用它:

// previous code here
T2.Start();

// wait for threads to be done
T1.Join();
T2.Join();

// now both of them are done
ctx.SaveChanges();
// end of using(...) and other code

编辑:我忘了提及:同时使用Join(),您可以摆脱Thread.Sleep(100);。我相信这就是你在第二个帖子上出错的原因。该调用将暂停执行当前线程(将启动T2)100ms,并在此期间T1成功完成它的工作。