Eu tenho uma interface com algumas funções assíncronas. Algumas das classes que implementam a interface não têm nada a esperar, e algumas podem apenas lançar. É um pouco chato com todos os avisos.
Quando não estiver usando o await em uma função assíncrona.
É possível suprimir a mensagem?
public async Task<object> test()
{
throw new NotImplementedException();
}
aviso CS1998: Este método assíncrono não tem operadores 'em espera' e será executado de forma síncrona. Considere usar o operador 'await' para aguardar chamadas de API sem bloqueio ou 'await Task.Run (...)' para fazer trabalho vinculado à CPU em um thread de segundo plano.
c#
asynchronous
Simon
fonte
fonte
Respostas:
Métodos retornando
Task
, eu acredito.async
é um detalhe de implementação, portanto, não pode ser aplicado a métodos de interface.Nesses casos, você pode tirar vantagem do fato de que
async
é um detalhe de implementação.Se você não tiver nada para fazer
await
, pode simplesmente retornarTask.FromResult
:No caso de arremesso
NotImplementedException
, o procedimento é um pouco mais prolixo:Se você tiver muitos métodos de lançamento
NotImplementedException
(o que por si só pode indicar que alguma refatoração no nível de design seria boa), você poderia resumir o prolixo em uma classe auxiliar:A classe auxiliar também reduz o lixo que o GC teria que coletar, uma vez que cada método com o mesmo tipo de retorno pode compartilhar seus objetos
Task
eNotImplementedException
.Tenho vários outros exemplos de tipo de "constante de tarefa" em minha biblioteca AsyncEx .
fonte
Task
. Em vez disso, seu método será lançado antes mesmo de ter a chance de criar umTask
. Eu realmente acho que o melhor padrão é definir umasync
método semawait
operadores. Isso garante que o código dentro do método seja tratado como parte doTask
.await Task.FromResult(0);
ao seu método. Isso não deve ter nenhum impacto significativo no desempenho (ao contrário de Task.Yield ()).return Task.CompletedTask;
- o mais simples de todos.Outra opção, se você deseja manter o corpo da função simples e não escrever código para suportá-lo, é simplesmente suprimir o aviso com # pragma:
Se isso for bastante comum, você pode colocar a instrução de desativação no início do arquivo e omitir a restauração.
http://msdn.microsoft.com/en-us/library/441722ys(v=vs.110).aspx
fonte
Outra maneira de preservar a palavra-chave assíncrona (caso você queira mantê-la) é usar:
Depois de preencher o método, você pode simplesmente remover a instrução. Eu uso muito isso, especialmente quando um método pode esperar algo, mas nem toda implementação realmente o faz.
fonte
Task.Run
chamada.Task.CompletedTask
parece não existir mais.Task.FromResult
é a melhor resposta. Para essa matéria, se você estiver indo para lançar uma exceção, parece outra resposta veio em jogo a respeitoTask.FromException
de fazer isso nunca a solução ideal. Você concordaria?Há uma diferença entre as soluções e, estritamente falando, você deve saber como o chamador vai chamar o método assíncrono, mas com o padrão de uso padrão que assume ".Wait ()" no resultado do método - " return Task.CompletedTask " é a melhor solução.
Nota:
FromResult
não pode ser comparado diretamente.Código de teste:
}
fonte
#pragma
um pareça incorrer em sobrecarga. Provavelmente tanto overhead como se, em vez de retornar,CompletedTask
você tivesse criado e completado umAsyncOperation
. Seria bom poder dizer ao compilador que não há problema em pular isso quando o método for executado de maneira síncrona.Task.CompletedTask
é semelhante aTask.FromResult
? Seria interessante saber - espero que FromResult seja mais análogo e ainda tenha o melhor desempenho se você precisar retornar um valor.Eu sei que este é um tópico antigo e talvez não tenha o efeito certo para todos os usos, mas o que se segue é o mais próximo que posso chegar de simplesmente lançar um NotImplementedException quando ainda não implementei um método, sem alterar a assinatura do método. Se for problemático, ficaria feliz em saber sobre isso, mas pouco importa para mim: eu só uso isso durante o desenvolvimento de qualquer maneira, então o seu desempenho não é tão importante. Ainda assim, ficaria feliz em saber por que é uma má ideia, se for.
Aqui está o tipo que adicionei para tornar isso possível.
fonte
Apenas para atualizar a resposta de Stephen, você não precisa mais escrever a
TaskConstants
classe, pois há um novo método auxiliar:fonte
Caso você já se vincule à extensão reativa, também pode fazer:
Reactive e async / await são incríveis por si só, mas também funcionam bem juntos.
Os itens necessários são:
fonte
Pode ser ocorrido cs1998 abaixo.
Então você pode reformar abaixo.
fonte
Você pode tentar isto:
fonte
Experimente isto:
[System.Diagnostics.CodeAnalysis.SuppressMessage("Await.Warning", "CS1998:Await.Warning")]
Consulte: https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.codeanalysis.suppressmessageattribute?view=netframework-4.7.2
fonte
Se você não tem nada a esperar, retorne Task.FromResult
fonte
Aqui estão algumas alternativas, dependendo da assinatura do seu método.
fonte
fonte
Você pode eliminar a palavra-chave async do método e apenas fazer com que ela retorne Task;
fonte