Xamarin Forms - C # - Async e Await Not Working?
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
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());
}