c# - TaskCompletionSource: Cuándo usar SetResult() versus TrySetResult(), etc.
asynchronous task-parallel-library (1)
Estoy tratando de TaskCompletionSource
el TPL, las nuevas funciones async
/ await
en C # 5 y los misterios de TaskCompletionSource
.
Algo que no tengo claro es cuándo usar SetResult
, SetException
y SetCancel
versus TrySetResult
, TrySetException
y TrySetCancel
.
Esto es lo que MSDN tiene que decir:
Esta operación devolverá falso si la Tarea ya está en uno de los tres estados finales: RanToCompletion, Faulted, o Canceled.
Este método también devuelve falso si la Tarea subyacente ya ha sido eliminada.
Ok, entiendo eso, pero en realidad no ofrece ninguna guía sobre cuándo o por qué usar uno sobre el otro.
Entonces, ¿cuál es el problema?
Sospecho que el punto es que si hay una sola cosa que establecerá el resultado, simplemente llame a SetResult
etc. Si termina llamando a SetResult
dos veces, eso indica un error. (Del mismo modo, si TaskCompletionSource
ha sido eliminado)
Si tiene varios hilos que podrían estar tratando de establecer el resultado al mismo tiempo (por ejemplo, está allí para indicar el primer resultado de varias llamadas al servicio web paralelas) entonces use TrySetResult
, ya que es completamente razonable para múltiples hilos a " intente "establecer el resultado, sin saber si otro hilo ya lo ha configurado.
No he visto ninguna orientación oficial al respecto, pero eso tendría sentido.