Xamarin Forms - C # - Async e Await Not Working?

Sep 10 2020

Sto lottando con i metodi async e await in C #.

Voglio assicurarmi che la mia variabile "clientToken" sia popolata prima di procedere con la chiamata API.

Quindi metto un awaitmetodo davanti alla funzione gateway.ClientToken.Generate();ma restituisce un errore:

Errore CS1061: "stringa" non contiene una definizione per "GetAwaiter" e non è stato possibile trovare alcun metodo di estensione accessibile "GetAwaiter" che accetta un primo argomento di tipo "stringa" (manca una direttiva using o un riferimento all'assembly?)

Ecco il mio codice:


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

Risposte

5 00110001 Sep 10 2020 at 12:38

Ignorando qualsiasi altro problema, Generaterestituisce solo un file string.

Restituisce una stringa che contiene tutte le informazioni di autorizzazione e configurazione necessarie al client per inizializzare l'SDK del client per comunicare con Braintree.

Alla tua domanda

Voglio assicurarmi che la mia variabile "clientToken" sia popolata prima di procedere con la chiamata API.

Tutto quello che devi fare è rimuovere await, le stringhe non sono attendibili e la funzione restituisce in modo sincrono e immediato

Nota inoltre, non c'è nulla awaitnel tuo metodo, GetBraintreeTokenquindi non ha bisogno della asyncparola chiave o restituisce un Task.

Se desideri eseguirlo in modo asincrono , puoi chiamarlo dal Task.Run()costruttore o OnAppearingdall'evento della pagina

Ad esempio, dato

private void GetBraintreeToken()
{ ...

Potresti

public Braintree()
{
    InitializeComponent();
    Task.Run(() => GetBraintreeToken());
}