Saya perlu memodifikasi program yang sudah ada dan berisi kode berikut:
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
Tetapi ini terasa sangat aneh bagi saya, pertama-tama penggunaan async
dan await
dalam pemilihan. Menurut jawaban Stephen Cleary ini, saya seharusnya bisa menghilangkannya.
Lalu yang kedua Select
yang memilih hasilnya. Bukankah ini berarti tugas sama sekali bukan asinkron dan dilakukan secara serempak (begitu banyak usaha sia-sia), atau akankah tugas dilakukan secara serempak dan ketika selesai, sisa permintaan dieksekusi?
Haruskah saya menulis kode di atas seperti mengikuti menurut jawaban lain oleh Stephen Cleary :
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
dan apakah ini sama seperti ini?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
Sementara saya sedang mengerjakan proyek ini saya ingin mengubah contoh kode pertama tetapi saya tidak terlalu tertarik untuk mengubah kode async (tampaknya bekerja). Mungkin saya hanya mengkhawatirkan apa-apa dan ketiga sampel kode melakukan hal yang persis sama?
ProcessEventsAsync terlihat seperti ini:
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Task<InputResult>
dengan InputResult
menjadi kelas khusus.
Select
hasil dari tugas sebelum Anda Where
.
Result
properti tugas