Est-il prudent d’appeler la méthode ContinueWith sur un TaskCompletionSource.Task (appelé .SetResult)?

Est-il prudent d’utiliser la méthode ContinueWith(...) sur une TaskCompletionSource.Task si la TaskCompletionSource.SetResult(...) a déjà été appelée?

J’espère que ce code de base aidera à formuler la question:

 // this was written inside the question box, please excuse any silly errors and lack of error checking (I'm not near VS right now)... private WebClient _webClient = new WebClient(); public Task GetExamplePage() { var tcs = new TaskCompletionSource(); web.DownloadSsortingngCompleted += (s, ea) => tcs.SetResult(ea.Result); web.DownloadSsortingngAsync(new URI(@"http://www.example.com/example.html")); return tcs.task; } public void ProcessExamplePage() { var task = GetExamplePage(); Thread.Sleep(1000); task.ContinueWith(t => Console.WriteLine(t.Result)); // *line in question* } 

Console.WriteLine(...) s’exécutera-t-il si l’événement WebClient.DownloadSsortingngCompleted a déjà été déclenché avant la task.ContinueWith est définie?

MSDN a ceci à dire ( Task.ContinueWith ):

Méthode Task.ContinueWith

L’exécution de la tâche renvoyée ne sera pas planifiée tant que la tâche en cours ne sera pas terminée, qu’elle se termine correctement, qu’elle soit défaillante en raison d’une exception non gérée ou qu’elle se termine prématurément pour cause d’annulation.

Malheureusement, cela ne mentionne pas ce qui se passe si cette méthode est appelée et que la tâche est déjà terminée.

Merci d’avance pour toute information que vous pouvez fournir! 🙂

Oui, cela devrait aller, ContinueWith vérifie si la tâche précédente est terminée ou non, si c’est le cas, elle mettra immédiatement la suite en queue.

Si la tâche spécifiée est déjà terminée au moment de l’appel de ContinueWith, la continuation synchrone sera exécutée sur le thread qui appelle ContinueWith. https://msdn.microsoft.com/en-us/library/dd321576(v=vs.110).aspx