web-dev-qa-db-fra.com

TaskCompletSource: Quand utiliser SETRESULT () VERSUS TRYSEREDESULT (), etc.

J'essaie d'envelopper ma tête autour du TPL, le nouveau async/await fonctionnalités du C # 5 et des mystères de TaskCompletionSource.

Une chose qui n'est pas clair pour moi, c'est quand utiliser SetResult, SetException et SetCancel versus TrySetResult, TrySetException et TrySetCancel.

C'est ce que MSDN a à dire:

Cette opération reviendra de faux si la tâche est déjà dans l'un des trois états finaux: RANTOCOMPOMPOMPÉTION, FRAIS ou ANNULÉE.

Cette méthode renvoie également false si la tâche sous-jacente a déjà été disposée.

Ok, je l'obtiens, mais cela n'offre pas vraiment de guidage lorsque ou pourquoi utiliser l'un sur l'autre.

Alors, quel est le problème?

52
HolySamosa

I suspect Le point est que s'il n'y a qu'une seule chose qui réglera le résultat, appelez simplement SetResult etc. Si vous finissez par appeler SetResult deux fois, cela indique que cela indique un bug. (De même si le TaskCompletionSource a été disposé.)

Si vous avez plusieurs threads qui pourraient tous essayer de définir le résultat en même temps (par exemple, il est là pour indiquer le premier résultat de plusieurs appels de service Web parallèle), utilisez TrySetResult, car il est entièrement raisonnable Pour plusieurs threads à "essayer" pour définir le résultat, ignorez-vous si un autre thread l'a déjà défini.

Je n'ai pas vu de conseils officiels à ce sujet, mais cela aurait un sens.

62
Jon Skeet