Xamarin Forms - C# - Async 和 Await 不起作用?

Kho*_*hoa 1 c# ios async-await xamarin.forms

我正在努力使用C# 中的async 和 await方法。

我想确保在继续 API 调用之前填充了我的“clientToken”变量。

然后我await在函数前面放了一个方法,gateway.ClientToken.Generate();但它返回一个错误:

错误 CS1061:“string”不包含“GetAwaiter”的定义,并且找不到接受“string”类型的第一个参数的可访问扩展方法“GetAwaiter”(您是否缺少 using 指令或程序集引用?)

这是我的代码:


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);
         }
Run Code Online (Sandbox Code Playgroud)

AAA*_*ddd 5

不考虑任何其他问题,Generate只返回一个string.

返回一个字符串,其中包含您的客户端初始化客户端 SDK 以与 Braintree 通信所需的所有授权和配置信息。

对于你的问题

我想确保在继续 API 调用之前填充了我的“clientToken”变量。

您需要做的就是删除await,字符串不是可等待的,并且函数会立即同步返回

另请注意,await您的方法中没有任何内容,GetBraintreeToken因此它不需要async关键字或返回Task.

如果您想异步运行它,您可以Task.Run()在构造函数或页面OnAppearing事件中调用它。

例如给定

private void GetBraintreeToken()
{ ...
Run Code Online (Sandbox Code Playgroud)

你可以

public Braintree()
{
    InitializeComponent();
    Task.Run(() => GetBraintreeToken());
}
Run Code Online (Sandbox Code Playgroud)