c# asynchronous task-parallel-library async-await c#-5.0

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.