2013-12-17 99 views
69

這是我的代碼:實體框架6中的多異步?

var banner = context.Banners.ToListAsync() 
var newsGroup = context.NewsGroups.ToListAsync() 
await Task.WhenAll(banner, newsGroup); 

但是,當我打電話從控制器的功能。它顯示錯誤

在上一次異步操作完成之前,在此上下文中開始第二個操作。在調用此上下文中的另一個方法之前,請使用'await'來確保任何異步操作已完成。任何實例成員不保證是線程安全的。

請幫我解決這個問題。

+6

的異常清澈,你有什麼要求? –

+0

我有2個任務。如果我運行每個任務。它的成功。但如果我像上面的代碼一樣運行。這是錯誤 –

回答

91

該異常清楚地解釋了每次允許的上下文只有一個異步操作。

所以,你要麼必須await逐一時間作爲錯誤信息顯示:

var banner = await context.Banners.ToListAsync(); 
var newsGroup = await context.NewsGroups.ToListAsync(); 

或者您可以使用多個環境:如果您使用的IoC容器

var banner = context1.Banners.ToListAsync(); 
var newsGroup = context2.NewsGroups.ToListAsync(); 
await Task.WhenAll(banner, newsGroup); 
+0

它的工作。非常感謝你。 –

+25

只是一個說明,如果你有一個懶惰的變量在查詢中使用這個上下文,即使它有這個await它也會拋出相同的錯誤,只是在查詢之前得到這個屬性,找到這個很麻煩。 –

+7

@ Pedro.The.Kid:一般來說,不要在異步數據庫訪問中使用延遲加載。延遲加載始終是同步的,所以使用包含或單獨查詢其他數據要好得多。 –

1

如果使用統一的依賴注入例如存儲庫模式,您將使用兩個或多個環境與創建/更新收到以下錯誤/刪除:

的關係這兩個對象之間不能定義,因爲它們被附加到不同的ObjectContext對象上,因爲它們是 。

這可以使用PerRequestLifetimeManager來解決。這裏更多的信息:

C# EF6 make multiple async calls to one context using Unity - Asp.Net Web Api

container.RegisterType<DbContext>(new PerRequestLifetimeManager()); 
container.RegisterType<ISupplierRepository, SupplierRepository>(); 
container.RegisterType<IContactRepository, ContactRepository>();