Ini kode saya:
var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);
Tetapi ketika saya memanggil fungsi dari pengontrol. Itu menunjukkan kesalahan
Operasi kedua dimulai pada konteks ini sebelum operasi asinkron sebelumnya selesai. Gunakan 'await' untuk memastikan bahwa semua operasi asinkron telah selesai sebelum memanggil metode lain dalam konteks ini. Setiap anggota instance tidak dijamin aman untuk thread.
Tolong bantu saya mengatasi masalah ini.
entity-framework
asynchronous
entity-framework-6
Sebuah Hv
sumber
sumber
Jawaban:
Pengecualian menjelaskan dengan jelas bahwa hanya ada satu operasi asinkron per konteks yang diperbolehkan dalam satu waktu.
Jadi, Anda harus melakukannya
await
satu per satu seperti yang disarankan pesan kesalahan:var banner = await context.Banners.ToListAsync(); var newsGroup = await context.NewsGroups.ToListAsync();
Atau Anda dapat menggunakan banyak konteks:
var banner = context1.Banners.ToListAsync(); var newsGroup = context2.NewsGroups.ToListAsync(); await Task.WhenAll(banner, newsGroup);
sumber
Jika Anda menggunakan container IoC untuk injeksi Penyedia Data, pertimbangkan untuk menggunakan jenis "transient" atau "PerWebRequest" untuk siklus proses Anda.
Misalnya: https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md
sumber
Jika Anda menggunakan Unity untuk injeksi ketergantungan dengan misalnya pola repositori, Anda akan mendapatkan kesalahan berikut menggunakan dua atau lebih konteks dengan buat / perbarui / hapus:
Ini bisa diselesaikan dengan menggunakan
PerRequestLifetimeManager
. Info lebih lanjut di sini:C # EF6 membuat beberapa panggilan asinkron ke satu konteks menggunakan Unity - Asp.Net Web Api
container.RegisterType<DbContext>(new PerRequestLifetimeManager()); container.RegisterType<ISupplierRepository, SupplierRepository>(); container.RegisterType<IContactRepository, ContactRepository>();
sumber