Tenho um código assíncrono ao qual gostaria de adicionar um CancellationToken
. No entanto, existem muitas implementações onde isso não é necessário, então eu gostaria de ter um parâmetro padrão - talvezCancellationToken.None
. Contudo,
Task<x> DoStuff(...., CancellationToken ct = null)
rendimentos
Um valor do tipo '' não pode ser usado como parâmetro padrão porque não há conversões padrão para o tipo 'System.Threading.CancellationToken'
e
Task<x> DoStuff(...., CancellationToken ct = CancellationToken.None)
O valor do parâmetro padrão para 'ct' deve ser uma constante de tempo de compilação
Existe alguma maneira de ter um valor padrão para CancellationToken
?
CancellationToken.None
se tornar algo maisdefault(CancellationToken)
.default(CancellationToken)
?CancellationToken.None
se tornará de fato obsoleto Até a Microsoft está usando em seudefault(CancellationToken)
lugar. Por exemplo, consulte os resultados da pesquisa no código-fonte do Entity Framework.Infelizmente, isso não é possível, pois
CancellationToken.None
não é uma constante de tempo de compilação, que é um requisito para valores padrão em argumentos opcionais.Você pode fornecer o mesmo efeito, no entanto, criando um método sobrecarregado em vez de tentar usar os parâmetros padrão:
fonte
CancellationToken cancellationToken = default(CancellationToken)
? Também descrito aqui blogs.msdn.microsoft.com/andrewarnottms/2014/03/19/…Aqui estão várias soluções, em ordem decrescente de bondade geral:
1. Usando
default(CancellationToken)
como valor padrão:Semanticamente,
CancellationToken.None
seria o candidato ideal para o padrão, mas não pode ser usado como tal porque não é uma constante de tempo de compilação.default(CancellationToken)
é a próxima melhor coisa porque é uma constante de tempo de compilação e oficialmente documentada para ser equivalente aCancellationToken.None
.2. Fornecer uma sobrecarga de método sem um
CancellationToken
parâmetro:Ou, se você preferir sobrecargas de método em vez de parâmetros opcionais (consulte esta e esta pergunta sobre esse tópico):
Para métodos de interface, o mesmo pode ser alcançado usando métodos de extensão:
Isso resulta em uma interface mais estreita e evita que os implementadores gravem explicitamente a sobrecarga do método de encaminhamento.
3. Tornando o parâmetro anulável e usando
null
como valor padrão:Gosto menos dessa solução porque os tipos anuláveis vêm com uma pequena sobrecarga de tempo de execução e as referências ao token de cancelamento se tornam mais detalhadas por causa do operador de coalescência nulo
??
.fonte
Outra opção é usar um
Nullable<CancellationToken>
parâmetro, padronizá-lonull
e lidar com ele dentro do método:fonte
As versões mais recentes do C # permitem uma sintaxe simplificada para a versão padrão (CancelamentoToken). Por exemplo:
fonte
A resposta de Tofutim é uma maneira, mas pelos comentários vejo que as pessoas têm problemas com isso.
Nesse caso, sugeri que se pode ter um método como segue:
e sobrecarregá-lo como:
Isso compila, porque o valor de
CancellationToken.None
não é necessário no momento da compilação.fonte