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 asyncdan awaitdalam pemilihan. Menurut jawaban Stephen Cleary ini, saya seharusnya bisa menghilangkannya.
Lalu yang kedua Selectyang 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 InputResultmenjadi kelas khusus.
Selecthasil dari tugas sebelum Anda Where.
Resultproperti tugas