Xamarin Forms - C # - Async and Await Not Working?
Zmagam się z metodami async i await w języku C #.
Chcę się upewnić, że moja zmienna „clientToken” jest wypełniona przed kontynuowaniem wywołania interfejsu API.
Następnie umieszczam awaitmetodę przed funkcją, gateway.ClientToken.Generate();ale zwraca ona błąd:
Błąd CS1061: „ciąg” nie zawiera definicji „GetAwaiter” i nie można znaleźć żadnej dostępnej metody rozszerzenia „GetAwaiter” akceptującej pierwszy argument typu „ciąg” (czy brakuje dyrektywy using lub odwołania do zestawu?)
Oto mój kod:
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);
}
Odpowiedzi
Pomijając każdy inny problem, Generatepo prostu zwraca plik string.
Zwraca ciąg zawierający wszystkie informacje o autoryzacji i konfiguracji, których klient potrzebuje do zainicjowania zestawu SDK klienta do komunikacji z Braintree.
Na twoje pytanie
Chcę się upewnić, że moja zmienna „clientToken” jest wypełniona przed kontynuowaniem wywołania interfejsu API.
Wszystko, co musisz zrobić, to usunąć await, ciągi nie są oczekiwane, a funkcja zwraca synchronicznie i natychmiast
Zauważ również, że awaitw Twojej metodzie nie ma nic do , GetBraintreeTokenwięc nie potrzebuje ona asyncsłowa kluczowego ani nie zwraca pliku Task.
Jeśli chcesz uruchomić go asynchronicznie , możesz wywołać go z Task.Run()poziomu konstruktora lub OnAppearingzdarzenia strony
Np. Podane
private void GetBraintreeToken()
{ ...
Mógłbyś
public Braintree()
{
InitializeComponent();
Task.Run(() => GetBraintreeToken());
}