Formulários Xamarin - C # - Async e Await não funcionam?
Estou lutando com métodos assíncronos e de espera em C #.
Quero ter certeza de que minha variável "clientToken" foi preenchida antes de prosseguir com a chamada de API.
Em seguida, coloco um awaitmétodo na frente da função, gateway.ClientToken.Generate();mas ele está retornando um erro:
Erro CS1061: 'string' não contém uma definição para 'GetAwaiter' e nenhum método de extensão acessível 'GetAwaiter' que aceita um primeiro argumento do tipo 'string' pode ser encontrado (está faltando uma diretiva using ou uma referência de assembly?)
Este é meu código:
public Braintree()
{
InitializeComponent();
Task task = GetBraintreeToken();
}
private async Task GetBraintreeToken()
{
var gateway = new BraintreeGateway
{
Environment = Environment.SANDBOX,
MerchantId = "xxxx",
PublicKey = "xxx",
PrivateKey = "xxxx"
};
var clientToken = await gateway.ClientToken.Generate();
Result<PaymentMethodNonce> result_nonce = gateway.PaymentMethodNonce.Create(clientToken);
}
Respostas
Desconsiderando qualquer outro problema, Generateapenas retorna a string.
Retorna uma string que contém todas as informações de autorização e configuração de que seu cliente precisa para inicializar o SDK do cliente para se comunicar com Braintree.
Para sua pergunta
Quero ter certeza de que minha variável "clientToken" foi preenchida antes de prosseguir com a chamada de API.
Tudo que você precisa fazer é remover o await, cordas não são uma awaitable ea função retorna de forma síncrona e imediatamente
Observe também que não há nada awaitem seu método, GetBraintreeTokenportanto, ele não precisa da asyncpalavra - chave ou retorna um Task.
Se você deseja executá-lo de forma assíncrona , pode chamá-lo de Task.Run()em seu construtor ou OnAppearingevento de página
Por exemplo, dado
private void GetBraintreeToken()
{ ...
Você poderia
public Braintree()
{
InitializeComponent();
Task.Run(() => GetBraintreeToken());
}