Alguém pode explicar o que isso significa em um método síncrono? Se eu tentar mudar o método async
, o VS reclamará.
Isso funciona:
public Task MethodName()
{
return Task.FromResult<object>(null);
}
Isso não funciona:
public async Task MethodName()
{
return Task.FromResult<object>(null);
}
Então, basicamente, eu gostaria de saber o que exatamente isso significa: Task.FromResult<object>(null);
c#
asynchronous
async-await
David Dury
fonte
fonte
return;
funcionar também ...!void
função.Respostas:
async
métodos são diferentes dos métodos normais. O que você retornar dosasync
métodos está envolvido em umTask
.Se você não retornar nenhum valor (nulo), ele será quebrado
Task
, se você retornarint
, será quebradoTask<int>
e assim por diante.Se seu método assíncrono precisar retornar,
int
marque o tipo de retorno do método comoTask<int>
e você retornará semint
a opçãoTask<int>
. Compilador irá converter oint
queTask<int>
para você.Da mesma forma, quando você retorna
Task<object>
, o tipo de retorno do método deve serTask<Task<object>>
Como seu método está retornando
Task
, ele não deve retornar nenhum valor. Caso contrário, não será compilado.Lembre-se de que o método assíncrono sem uma
await
declaração não éasync
.fonte
DoStuff()
também. Por exemplo:var x = await DoStuff();
return await Task.FromResult<object>(null);
Task.WhenAny
é um exemplo.Você precisa usar a palavra-chave wait quando usar async e seu tipo de retorno de função deve ser genérico Aqui está um exemplo com valor de retorno:
Aqui está um exemplo sem valor de retorno:
Leia estes:
TPL: http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx e tarefas: http://msdn.microsoft.com/en-us/library/system.threading .tasks (v = vs.110) .aspx
Assíncrono: http://msdn.microsoft.com/en-us/library/hh156513.aspx Aguardar: http://msdn.microsoft.com/en-us/library/hh156528.aspx
fonte
null
diretamente em vez de aguardar uma tarefa fictícia.async
método será executado de forma assíncrona com uma sugestão de usar aawait
palavra - chave em algum lugar do método. Sugiro apenas usarreturn Task.FromResult((object)null);
e remover aasync
palavra-chave para reduzir o ruído de aviso do compilador.return
em uma tarefa, mas a tarefa continua em execução, porquereturn
não está retornando umTask
A adição da palavra-chave assíncrona é apenas um açúcar sintático para simplificar a criação de uma máquina de estado. Em essência, o compilador pega seu código;
E transforma em;
Se o seu código tiver alguma
await
palavra-chave, o compilador deve usar seu método e transformá-lo em uma classe para representar a máquina de estado necessária para executá-lo. Em cadaawait
palavra - chave, o estado das variáveis e a pilha serão preservadas nos campos da classe, a classe se adicionará como um gancho de conclusão à tarefa que você está aguardando e retornará.Quando essa tarefa for concluída, sua tarefa será executada novamente. Portanto, algum código extra é adicionado à parte superior do método para restaurar o estado das variáveis e pular para a próxima camada do seu código.
Consulte O que async & waitit gera? para um exemplo sangrento.
Esse processo tem muito em comum com a maneira como o compilador lida com métodos do iterador com instruções de rendimento.
fonte
Esta é uma tarefa que está retornando uma tarefa do tipo String (função anônima C # ou, em outras palavras, uma delegação é usada 'Func')
fonte
Para obter respostas adequadas dos métodos assíncronos, é necessário aguardar enquanto chama esses métodos de tarefa. Isso aguardará a conversão para o tipo de valor retornado em vez do tipo de tarefa.
fonte