web-dev-qa-db-ja.com

Entity Framework 6のマルチ非同期?

これは私のコードです:

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

しかし、コントローラーから関数を呼び出したとき。エラーを示した

前の非同期操作が完了する前に、このコンテキストで2番目の操作が開始されました。 'await'を使用して、このコンテキストで別のメソッドを呼び出す前に非同期操作が完了したことを確認します。インスタンスメンバーは、スレッドセーフであるとは限りません。

この問題の解決を手伝ってください。

84
An Hv

例外は、一度に許可されるコンテキストごとに1つの非同期操作しかないことを明確に説明しています。

したがって、エラーメッセージが示唆するように、一度に1つずつawaitする必要があります。

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

または、複数のコンテキストを使用できます。

var banner = context1.Banners.ToListAsync();
var newsGroup = context2.NewsGroups.ToListAsync();
await Task.WhenAll(banner, newsGroup);
114
Stephen Cleary

データプロバイダーインジェクションにIoCコンテナーを使用している場合は、ライフサイクルに「transient」または「PerWebRequest」タイプを使用することを検討してください。

例: https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md

4
Teoman shipahi

たとえば、リポジトリパターンを使用した依存性注入にUnityを使用すると、create/update/deleteで2つ以上のコンテキストを使用すると、次のエラーが発生します。

2つのオブジェクト間の関係は、異なるObjectContextオブジェクトに関連付けられているため、定義できません。

これはPerRequestLifetimeManagerを使用して解決できます。詳細はこちら:

C#EF6は、Unityを使用して1つのコンテキストに複数の非同期呼び出しを行います-Asp.Net Web Api

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