Apakah mungkin menggunakan Async saat menggunakan ForEach? Di bawah ini adalah kode yang saya coba:
using (DataContext db = new DataLayer.DataContext())
{
db.Groups.ToList().ForEach(i => async {
await GetAdminsFromGroup(i.Gid);
});
}
Saya mendapatkan kesalahan:
Nama 'Async' tidak ada dalam konteks saat ini
Metode yang menyertakan pernyataan using disetel ke async.
c#
async-await
James Jeffery
sumber
sumber
List.ForEach()
bukan bagian dari LINQ.async
. Mereka sangat membantu!foreach
denganawait
di tubuh lingkaran Anda.ForEach
hanya membutuhkan jenis delegasi sinkron, dan tidak ada kelebihan beban saat mengambil jenis delegasi asinkron. Jadi jawaban singkatnya adalah "tidak ada yang menulis asynchronousForEach
". Jawaban yang lebih panjang adalah Anda harus mengasumsikan beberapa semantik; Misalnya, apakah barang harus diproses satu per satu (sukaforeach
), atau bersamaan (sukaSelect
)? Jika satu per satu, bukankah aliran asinkron menjadi solusi yang lebih baik? Jika bersamaan, apakah hasilnya harus dalam urutan barang asli atau dalam urutan penyelesaian? Haruskah gagal pada kegagalan pertama atau menunggu sampai semua selesai? DllSemaphoreSlim
untuk membatasi tugas-tugas asinkron.Metode ekstensi kecil ini akan memberi Anda iterasi asinkron yang aman-pengecualian:
Karena kita mengubah jenis kembalian lambda dari
void
menjadiTask
, pengecualian akan menyebar dengan benar. Ini akan memungkinkan Anda untuk menulis sesuatu seperti ini dalam praktik:sumber
async
harus sebelumi =>
ForEachAsync
pada dasarnya adalah metode perpustakaan, jadi menunggu mungkin harus dikonfigurasi denganConfigureAwait(false)
.Jawaban sederhananya adalah dengan menggunakan
foreach
kata kunci alih-alihForEach()
metodeList()
.sumber
Berikut adalah versi yang berfungsi dari varian async foreach di atas dengan pemrosesan berurutan:
Berikut implementasinya:
Apa perbedaan utamanya?
.ConfigureAwait(false);
yang mempertahankan konteks utas utama sementara pemrosesan sekuensial asinkron untuk setiap tugas.sumber
Dimulai dengan
C# 8.0
, Anda dapat membuat dan menggunakan aliran secara asinkron.Lebih
sumber
MoveNext
enumerator. Ini penting dalam kasus di mana enumerator tidak dapat mengambil elemen berikutnya secara instan, dan harus menunggu hingga salah satu elemen tersedia.Tambahkan metode ekstensi ini
Dan kemudian gunakan seperti ini:
sumber
Masalahnya adalah
async
kata kunci harus muncul sebelum lambda, bukan sebelum isi:sumber
async void
. Pendekatan ini memiliki masalah seputar penanganan pengecualian dan mengetahui kapan operasi asinkron selesai.