Retarder puis exécuter la tâche

Petite question, je veux attendre une seconde avant de lancer une tâche asynchrone sans valeur de retour.
Est-ce que c’est la bonne façon de le faire?

Task.Delay(1000) .ContinueWith(t => _mq.Send(message)) .Start(); 

Qu’advient-il des exceptions?

Tout d’abord, Start() ne fonctionne que sur les Task (très rares) créées à l’aide du constructeur de la Task (par exemple new Task(() => _mq.Send(message)) ). Dans tous les autres cas, une exception sera levée, car la Task est déjà démarrée ou en attente d’une autre Task .

Maintenant, le meilleur moyen de le faire serait probablement de placer le code dans une méthode async distincte et d’en await :

 async Task SendWithDelay(Message message) { await Task.Delay(1000); _mq.Send(message); } 

Si vous faites cela, toute exception à la méthode Send() se retrouvera dans la Task retournée.

Si vous ne voulez pas faire cela, utiliser ContinueWith() est une approche raisonnable. Dans ce cas, l’exception serait dans la Task renvoyée par ContinueWith() .

En outre, en fonction du type de _mq , envisagez d’utiliser SendAsync() , si quelque chose de ce type est disponible.

Vous pouvez intercepter toute exception levée dans la tâche si vous attendez que la tâche se termine:

Sachez que votre exception lancée dans la tâche sera la plus interne.

 class Program { static void Main(ssortingng[] args) { try { Task task = Task.Delay(1000) .ContinueWith(t => Program.throwsException()); task.Wait(); } catch (Exception ex) { Console.WriteLine("Exception:" + ex.Message); // Outputs: Exception:One or more errors occurred. Console.WriteLine("Inner exception:" + ex.InnerException.Message); // Outputs: Exception:thrown } Console.ReadKey(); } static void throwsException() { Console.WriteLine("Method started"); throw new Exception("thrown"); } } 

Vous pourrez observer toutes les exceptions si vous Wait la tâche.

Les exceptions non gérées émises par le code utilisateur exécuté dans une tâche sont renvoyées au thread qui se joint, sauf dans certains scénarios décrits plus loin dans cette rubrique. Les exceptions sont propagées lorsque vous utilisez l’une des méthodes statiques ou d’instance Task.Wait ou Task.Wait et que vous les gérez en incluant l’appel dans une instruction try-catch.

Extrait de la gestion des exceptions (bibliothèque de tâches parallèles)

Soyez prudent avec les horaires. Les tâches utilisent un planificateur et ne sont pas garanties pour commencer lorsque vous dites «aller». Votre code garantira un délai d’ au moins 1000 ms après l’avoir indiqué à Start mais il n’est pas garanti que ce soit exactement 1000 ms.