Varolan bir programı değiştirmek gerekir ve aşağıdaki kodu içerir:
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
Ama bu benim için çok garip görünüyor, her şeyden önce seçimde async
ve await
seçimde. Göre bu cevap Stephen Cleary I tarafından bu düşmesi gerekir.
Sonra ikincisi Select
sonucu seçen . Bu, görevin hiç zaman uyumsuz olmadığı ve eşzamanlı olarak gerçekleştirildiği (hiçbir şey için çok fazla çaba) olmadığı veya görev zaman uyumsuz olarak gerçekleştirileceği ve sorgunun geri kalanının yürütüldüğü anlamına gelmiyor mu?
Stephen Cleary tarafından başka bir cevaba göre yukarıdaki kodu aşağıdaki gibi yazmalıyım :
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
ve tamamen böyle mi?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
Ben bu proje üzerinde çalışırken ben ilk kod örneğini değiştirmek istiyorum ama (görünüşte çalışan) zaman uyumsuz kod değiştirme konusunda çok istekli değilim. Belki sadece hiçbir şey için endişeleniyorum ve tüm 3 kod örnekleri aynı şeyi yapıyor?
ProcessEventsAsync şöyle görünür:
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Task<InputResult>
olan InputResult
özel bir sınıf olma.
Select
görevinizden önceki sonuçları unutmuşsunuzdur Where
.
Result
, görevin özelliğine erişmeden sonuçları aldığınızdan emin olmalıyım