如何使用LINQ to Entities使用两个DbContext操作异步?

时间:2015-03-10 05:55:22

标签: c# multithreading linq entity-framework

我使用Linq to Entities执行数据库操作。

问题是如果缓存对象中没有数据,我试图使用单线程从数据库中获取数据。

它给了我以下错误:

  

创建模型时无法使用上下文。这个   如果在内部使用上下文,则可能抛出异常   OnModelCreating方法或者如果访问相同的上下文实例   并发多个线程。请注意DbContext的实例成员   和相关的类不保证是线程安全的。

克服我尝试了以下解决方案:

using (var tran = new TransactionScope())
{
    Task.Factory.StartNew(() => DoSomething());
    Task.Factory.StartNew(() => DoSomethingElse());
    // Wait all
    tran.Complete();
}

但是,如果我可以使用另一个运行的线程来执行此操作:

//My code
//thread to run Method1() 
method 1()
{
//DO SOMETHING
//CALL METHOD2()
} 

简单地这样做是好的:

string res = null;
Thread newThread = new Thread(() => {res = Method2();});

1 个答案:

答案 0 :(得分:2)

错误消息非常准确地指示问题。数据库上下文不是线程安全的。因此,您无法从与创建数据库上下文不同的线程访问数据库上下文。

你的问题清楚地表明你根本不理解线程,所以你真的需要从研究线程如何工作以及线程安全意味着什么开始。