Nama hewan diambil dari API yang dapat mengembalikan 404 jika hewan tidak ditemukan. Tetapi untuk mencatat kesalahan dengan benar, kita harus memiliki akses ke negara hewan. Apa itu mungkin? Saya telah membaca sesuatu dari seorang pria bernama Stephen Cleary yang membuat saya berpikir itu mungkin dengan lambda, tetapi saya tidak dapat menemukan apa pun.

var gettingNames = new List<Task<string>>();

foreach (var animal in animals)
{
    gettingNames.Add(this.zooApi.GetNameAsync(animal));
}

try
{
    await Task.WhenAll(gettingNames);
}
catch (Exception e)
{
    var exception = gettingNames.Where(task => task.IsFaulted)
        .SelectMany(x => x.Exception.InnerExceptions).First();

    this.logger.LogError("The animal name from {Country} was not found",
        animal.Country); // This is the goal
}
2
user33276346 29 September 2021, 23:48

2 jawaban

Anda hampir berhasil. :)

Daripada memiliki List<Task<string>> Anda memerlukan struktur Dictionary<Task<string>, string>:

static async Task Main()
{
    var taskInputMapping = new Dictionary<Task<string>, string>();
    var inputs = new[] { "input", "fault", "error", "test"};
    foreach (var input in inputs)
    {
        taskInputMapping.Add(DelayEcho(input), input);
    }

    try
    {
        await Task.WhenAll(taskInputMapping.Keys);
    }
    catch
    {
        foreach (var pair in taskInputMapping.Where(t => t.Key.IsFaulted))
        {
            Console.WriteLine($"{pair.Value}: {pair.Key.Exception?.GetType().Name}");
        }
    }
}

static readonly ImmutableArray<string> wrongInputs = 
    ImmutableArray.Create("error", "fault");
static async Task<string> DelayEcho(string input)
{
    if (wrongInputs.Contains(input)) throw new ArgumentException();
    await Task.Delay(10);
    return input;
}
  • taskInputMapping.Add(DelayEcho(input), input): Menyimpan input di sebelah Tugas itu sendiri
  • taskInputMapping.Where(t => t.Key.IsFaulted): Berulang melalui tugas yang salah
  • $"{pair.Value}: {pair.Key.Exception?.GetType().Name}": Mengambil input + kesalahan terkait
1
Peter Csala 30 September 2021, 06:51

Saya menggabungkan jawaban dan menghasilkan ini:

var tasks = animals.Select(async animal =>
{
    try
    {
        return await this.zooApi.GetNameAsync(animal);
    }
    catch (Exception ex)
    {
        this.logger.LogError(error,
            $"The {animal.Name} from {animal.Country} was not found");

        return null;
    }
});

var results = await Task.WhenAll(tasks);

foreach (var name in results.Where(x => x != null))...
1
user33276346 30 September 2021, 12:32