En C # y TPL ( Task Parallel Library ), la Task
clase representa un trabajo en curso que produce un valor de tipo T.
Me gustaría saber cuál es la necesidad del método Task.FromResult .
Es decir: en un escenario en el que ya tiene el valor producido a mano, ¿cuál es la necesidad de volver a incluirlo en una tarea?
Lo único que viene a la mente es que se usa como un adaptador para otros métodos que aceptan una instancia de Task.
c#
.net
task-parallel-library
task
async-await
ácido lisérgico
fuente
fuente
Respuestas:
Hay dos casos de uso comunes que he encontrado:
fuente
Task.FromResult
y un cliente que aguarde asincrónicamente la E / S de red. De esta manera, puede compartir la misma interfaz entre cliente / servidorChannelFactory
.IEnumerable<T>
derivar deIDisposable
: permite que lo enumerable tenga recursos disponibles, no lo obliga a hacerlo. NiFromResult
,async
niawait
generarán hilos.Task
método de retorno significa " puede ser asíncrono". Entonces, a veces los métodos reciben una firma asincrónica sabiendo muy bien que algunas implementaciones serán síncronas (por ejemplo,NetworkStream
deberían ser asíncronas, peroMemoryStream
deberían estar sincronizadas).Un ejemplo sería un método que utiliza un caché. Si el resultado ya está calculado, puede devolver una tarea completada con el valor (usando
Task.FromResult
). Si no es así, continúa y devuelve una tarea que representa el trabajo en curso.Ejemplo de caché: ejemplo de caché usando Task.FromResult para valores calculados previamente
fuente
Task.FromResult
, se pueden almacenar en caché.Task.FromResult(0)
,Task.FromResult(1)
,Task.FromResult(false)
yTask.FromResult(true)
se almacenan en caché. Se supone que no debe almacenar en caché una tarea para acceder a la red, pero una del resultado está perfectamente bien. ¿Preferiría crear uno cada vez que necesite devolver el valor?Úselo cuando desee crear un método esperado sin usar la palabra clave asíncrona. Encontré este ejemplo:
Aquí está creando su propia implementación de la interfaz IHttpActionResult para utilizarla en una acción de API web. Se espera que el método ExecuteAsync sea asíncrono, pero no tiene que usar la palabra clave asíncrona para hacerlo asíncrono y estar a la espera. Como ya tiene el resultado y no necesita esperar nada, es mejor usar Task.FromResult.
fuente
De MSDN:
http://msdn.microsoft.com/en-us/library/hh228607.aspx
fuente
Use Task.FromResult cuando desee tener una operación asincrónica, pero a veces el resultado está disponible sincrónicamente. Puede encontrar una buena muestra aquí http://msdn.microsoft.com/en-us/library/hh228607.aspx .
fuente
Task.FromResult
se usa para obtener un resultado asíncrono previamente almacenado en caché.Yo diría que podría usar Task.FromResult para métodos sincrónicos que tardan mucho tiempo en completarse mientras puede realizar otro trabajo independiente en su código. Sin embargo, prefiero hacer esos métodos para llamar asíncrono. Pero imagine la situación en la que no tiene control sobre el código llamado y desea ese procesamiento paralelo implícito.
fuente