Fire and Forget avec propagation garantie des exceptions
Dans une approche "Fire and Forget", une méthode est invoquée sans attendre son achèvement ou gérer son résultat. Cependant, lorsqu'une méthode renvoie une tâche, il ne s'agit pas véritablement de « Fire and Forget ». Les exceptions levées dans la tâche ne sont pas propagées au contexte appelant.
Pour garantir que les exceptions dans les méthodes « Fire and Forget » sont gérées ou escaladées, il est recommandé de modifier la méthode d'extension comme suit :
public static async void Forget(this Task task) { await task; }
En attendant la tâche, toutes les exceptions lancées dans la tâche seront propagées au contexte appelant et traitées ou escaladées en conséquence.
Gestion des exceptions attendues dans les méthodes « Fire and Forget »
La question initiale soulève une préoccupation concernant les méthodes qui peuvent générer des exceptions attendues et ignorables dans un « Fire and Forget » Oubliez" le contexte. Pour résoudre ce problème, la méthode d'extension peut être modifiée pour accepter une liste de types d'exceptions acceptables :
public static async void Forget(this Task task, params Type[] acceptableExceptions) { try { await task.ConfigureAwait(false); } catch (Exception ex) { // TODO: consider whether derived types are also acceptable. if (!acceptableExceptions.Contains(ex.GetType())) throw; } }
Cela permet à l'appelant de spécifier quels types d'exceptions doivent être ignorés et lesquels doivent être remontés, offrant ainsi un meilleur contrôle sur le comportement de gestion des exceptions dans les méthodes "Fire and Forget".
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!