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

Sep 10 2020

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

5 00110001 Sep 10 2020 at 12:38

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