talep üzerine her sonucu işlemek için bir yolu var mı? Bir görev
Evet
tamamlandığında yürütülen alacak bir temsilci/geri arama kayıt gibi
, sadece senin biraz düşünme ayarlamak zorunda.
Geri aramaları kaydetmeyi unut (ContinueWith
is a dangerous, extremely low-level API). Ayrıca, neredeyse tamamlanmadıkça görevleri sipariş etmek zorunda kalmazsınız. Bunun yerine, sorununuzu işlemleri (görevler) açısından düşünün.
Şu anda TimeSpan
döndüren bir dizi görev var. Bu koleksiyondaki her öğe TimeSpan
döndüren tek bir işlemdir. Gerçekten yapmak istediğiniz şey, orijinal işlemin tamamlanmasını bekledikten sonra işlem sonrası mantığınızı yürüten bir üst düzey işlemin konseptini sunmaktır.
Bu
async
/
await
için tam olarak ne olduğunu
:
private static async Task<TimeSpan> HandleResultAsync(Task<TimeSpan> operation)
{
var result = await operation;
// A task has finished. This will get executed.
// result is of type TimeSpan
...
return result; // (assuming you want to propagate the result)
}
Şimdi, mevcut operasyonlara bu üst düzey operasyonu uygulamak istiyoruz. LINQ en Select
bunun için idealdir: Sonuçlardan son koleksiyonunu gerekmiyorsa
IEnumerable<Task<TimeSpan>> tasks = ...
IEnumerable<Task<TimeSpan>> higherLevelTasks = tasks.Select(HandleResultAsync);
TimeSpan[] results = await Task.WhenAll(higherLevelTasks);
// By the time you get here, all results have been handled individually.
, bu daha da basitleştirilmiş olabilir:
private static async Task HandleResultAsync(Task<TimeSpan> operation)
{
var result = await operation;
// A task has finished. This will get executed.
// result is of type TimeSpan
...
}
IEnumerable<Task<TimeSpan>> tasks = ...
IEnumerable<Task> higherLevelTasks = tasks.Select(HandleResultAsync);
await Task.WhenAll(higherLevelTasks);
Belki 'görevleri [i] .ContinueWith()'? –