que estoy tratando de envolver mi cabeza alrededor de la TPL, los nuevos async
/await
características en C# 5, y los misterios de TaskCompletionSource
.TaskCompletionSource: Cuándo utilizar SetResult() frente TrySetResult(), etc
Una cosa que no me queda claro es cuándo usar SetResult
, SetException
, y SetCancel
frente TrySetResult
, TrySetException
y TrySetCancel
.
Esto es lo que tiene que decir MSDN:
Esta operación devolverá false si la tarea ya está en uno de los tres estados finales: RanToCompletion, con fallo o Cancelado.
Este método también devuelve falso si la tarea subyacente tiene ya se ha eliminado.
Ok, entiendo eso, pero en realidad no ofrece ninguna orientación sobre cuándo o por qué utilizar uno sobre el otro.
Entonces, ¿cuál es el problema?
es decir, realmente, la única razón por la que necesitaría llamar a 'TrySetResult' es si establece el resultado más de una vez. 'SetResult'" completa "la' Tarea' asociada, por lo que llamar 'SetResult' de nuevo intentará establecer el resultado' Task 'después de que la tarea se haya completado. (Bloques 'SetResult' hasta que' Task' se complete, al igual que 'TrySetResult') Si solo llamas a' SetResult' una vez, entonces nunca deberías 'TrySetResult'. FWIW. 'Cadenas de SetResult' a' TrySetResult' ... –
¡Gracias chicos, tienes mucho sentido! – HolySamosa
También tenga en cuenta que SetResult devuelve 'void' mientras TrySetResult devuelve' bool', por lo que si desea hacer algo de manera condicional en función del estado de la tarea, entonces 'TrySetResult' se comprueba y establece al mismo tiempo (¿atómicamente?). – chakrit