在EF中运行多个线程在单个上下文类中

时间:2015-10-13 10:51:53

标签: c# multithreading entity-framework thread-safety task

我有很长时间处理过程(从Db获取数据,如国家列表,业务列表(大约1500行))。所以我创建了一个单独的方法来获取这些数据。

但它是在说

  

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

private IList<Business> GetBusiness(IRepositories repos, IImageStore store)
{
    var data = repos.BusinessRepo.GetAll();
    //Some more calculation on the basis of Data.
    return data;
}

**similar function for country**

现在我从主

调用这些方法
Task<List<Business>>[] taskBusiness = new Task<List<Business>>[1];
 taskBusiness[0] = Task.Run(() => GetBusiness(repos, imageStore));

 Task<List<Country>>[] taskCountry = new Task<List<Country>>[1];
 taskCountry[0] = Task.Run(() => GetCountry(repos, imageStore));

 //Some More calculation
 .
 .
 // before method end
 Task.WaitAll(taskBusiness);
 Task.WaitAll(taskCountry);
 var business = taskBusiness[0].Result;
 var country = taskCountry[0].Result;

1 个答案:

答案 0 :(得分:1)

DbContext类不是线程安全的(您的错误消息几乎告诉您),因此您不应该在多个线程中使用相同的实例。相反,您应该为每个同时调用创建一个不同的对象。

来自DbContext <?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="AppTheme" parent="@android:style/Theme.Light.NoTitleBar.Fullscreen"> <item name="android:editTextStyle">@style/EditTextAppTheme</item> <item name="android:buttonStyle">@style/ButtonAppTheme</item> <item name="android:imageButtonStyle">@style/ImageButtonAppTheme</item> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> </style> (强调我的):

  

线程安全:此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。 不保证所有实例成员都是线程安全的。