Em C # e TPL ( Task Parallel Library ), a Task
classe representa um trabalho contínuo que produz um valor do tipo T.
Gostaria de saber qual é a necessidade do método Task.FromResult ?
Ou seja: em um cenário em que você já possui o valor produzido em mãos, qual é a necessidade de envolvê-lo novamente em uma tarefa?
A única coisa que vem à mente é que ele é usado como algum adaptador para outros métodos que aceitam uma instância de tarefa.
c#
.net
task-parallel-library
task
async-await
ácido lisérgico
fonte
fonte
Respostas:
Encontrei dois casos de uso comuns:
fonte
Task.FromResult
e um cliente que aguarda assincronamente a E / S da rede. Dessa forma, você pode compartilhar a mesma interface entre cliente / servidor usandoChannelFactory
.IEnumerable<T>
derivar deIDisposable
- permite que o enumerável tenha recursos disponíveis, não o obriga . NemFromResult
,async
nemawait
gerará tópicos.Task
método de retorno significa " pode ser assíncrono". Então, às vezes, os métodos recebem uma assinatura assíncrona sabendo muito bem que algumas implementações serão síncronas (por exemplo,NetworkStream
devem ser assíncronas, masMemoryStream
devem ser sincronizadas).Um exemplo seria um método que faz uso de um cache. Se o resultado já estiver calculado, você poderá retornar uma tarefa concluída com o valor (usando
Task.FromResult
). Caso contrário, prossiga e retorne uma tarefa que representa o trabalho em andamento.Exemplo de cache: exemplo de cache usando Task.FromResult para valores pré-calculados
fonte
Task.FromResult
, podem ser armazenadas em cache.Task.FromResult(0)
,Task.FromResult(1)
,Task.FromResult(false)
eTask.FromResult(true)
são armazenados em cache. Você não deve armazenar em cache uma tarefa para acesso à rede, mas uma do resultado é perfeitamente adequada. Você prefere criar um sempre que precisar retornar o valor?Use-o quando desejar criar um método aguardável sem usar a palavra-chave assíncrona. Encontrei este exemplo:
Aqui você está criando sua própria implementação da interface IHttpActionResult para ser usada em uma Ação da API da Web. Espera-se que o método ExecuteAsync seja assíncrono, mas você não precisa usar a palavra-chave async para torná-la assíncrona e aguardável. Como você já tem o resultado e não precisa aguardar nada, é melhor usar o Task.FromResult.
fonte
Do MSDN:
http://msdn.microsoft.com/en-us/library/hh228607.aspx
fonte
Use o Task.FromResult quando desejar ter uma operação assíncrona, mas às vezes o resultado está disponível de forma síncrona. Você pode encontrar uma boa amostra aqui http://msdn.microsoft.com/en-us/library/hh228607.aspx .
fonte
Task.FromResult
é usada para obter um resultado assíncrono em cache anteriormente.Eu argumentaria que você poderia usar o Task.FromResult para métodos síncronos que demoram muito tempo para serem concluídos enquanto você pode executar outro trabalho independente em seu código. Eu prefiro criar esses métodos para chamar assíncrono. Mas imagine a situação em que você não tem controle sobre o código chamado e deseja esse processamento paralelo implícito.
fonte