J'ai un projet .NET Core 2.1 qui a une BackgroundService
et je veux que sa responsabilité se limite à gérer l'enregistrement du résultat d'un groupe de tâches différentes qui peuvent renvoyer des valeurs différentes. Je veux regrouper tous leurs résultats dans une classe de gestionnaire de tâches pour enregistrer leurs résultats. Est-il possible d'avoir une List<Task>
qui contiendra tous les Task
à partir de ces méthodes asynchrones ?
Je ne veux pas avoir plusieurs Task
pour chaque méthode que je veux await
sur. Je préférerais qu'ils soient mis dans une List
d'une manière ou d'une autre, car il pourrait y avoir la possibilité d'avoir plus que ces trois méthodes asynchrones que je veux que ce gestionnaire gère.
Je pensais faire quelque chose comme :
public class MyTaskManager : BackgroundService
{
private readonly ILogger<MyTaskManager> _logger;
private APIInvoker _invoker;
public MyTaskManager (ILogger<MyTaskManager> logger, APIInvoker invoker)
{
_logger = logger;
_invoker= invoker;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
List<Task<object>> tasks = new List<Task<object>>();
tasks.Add(_invoker.GetImportWarningsAsync("1"));
tasks.Add(_invoker.GetImportErrorsAsync("2"));
tasks.Add(_invoker.GetImportStatusAsync("3"));
}
Où GetImportWarningsAsync
, GetImportErrorsAsync
, GetImportStatusAsync
sont définis comme suit :
internal async Task<string> GetImportWarningsAsync(...)
internal async Task<string> GetImportErrorsAsync(...)
internal async Task<ImportResponse> GetImportLeadStatusAsync(...)
Je suis confus sur le fait que je puisse faire tasks.Add(...)
s'ils renvoient des types différents et que je les ajoute à une List<Task<object>>
. Je ne pense pas que cela soit possible. Comment puis-je réaliser quelque chose comme ça ?
En fin de compte, je veux exécuter une méthode pour chaque Task
en tasks
quand l'un d'entre eux s'exécute.
eg.
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
List<Task<object>> tasks = new List<Task<object>>();
tasks.Add(_invoker.GetImportWarningsAsync("1"));
tasks.Add(_invoker.GetImportErrorsAsync("2"));
tasks.Add(_invoker.GetImportStatusAsync("3"));
Task<object> finishedTask = await Task.WhenAny(tasks);
tasks.Remove(finishedTask);
HandleTask(finishedTask, await finishedTask);
}
private void HandleTask(Task task, object value)
{
if (value is ImportResponse)
{
_logger.LogInformation((value as ImportResponse).someProp); // Log something
}
else
{
// Any other object type will be logged here - In this case string.
_logger.LogInformation(value.ToString());
}
}