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 asyncve awaitseç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.
Selectgörevinizden önceki sonuçları unutmuşsunuzdur Where.
Result, görevin özelliğine erişmeden sonuçları aldığınızdan emin olmalıyım