【问题标题】:Xamarin Forms - C# - Async and Await Not Working?Xamarin Forms - C# - 异步和等待不工作?
【发布时间】:2020-12-28 13:54:47
【问题描述】:

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

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

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

错误 CS1061:“字符串”不包含“GetAwaiter”的定义,并且找不到接受“字符串”类型的第一个参数的可访问扩展方法“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);
         }

【问题讨论】:

  • 如果Generate 方法包含可以运行异步的代码,您可以将方法更改为async Task&lt;string&gt; 而不是string 并从那里调用异步方法。如果没有,那么使这个方法异步是没有意义的,你将无法等待它。你只能等待任务

标签: c# ios xamarin.forms async-await


【解决方案1】:

不管任何其他问题,Generate 只返回一个string

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

你的问题

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

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

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

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

例如给定

private void GetBraintreeToken()
{ ...

你可以

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

【讨论】:

    猜你喜欢
    • 2014-08-15
    • 2019-01-13
    • 2014-06-06
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多