这是一个需要两个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();
}
}
答案 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成功完成它的工作。