Formulários Xamarin - C # - Async e Await não funcionam?

Sep 10 2020

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

5 00110001 Sep 10 2020 at 12:38

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());
}