【问题标题】:Async / await not working " string does not contain a defination fot GetAwaiter " and no extension异步/等待不工作“字符串不包含 GetAwaiter 的定义”并且没有扩展名
【发布时间】:2016-08-02 19:11:41
【问题描述】:

我正在 Visual Studio Xamarin 中制作 Android 应用程序,在应用程序的登录屏幕中,当通过 Web 服务与数据库建立连接以验证密码时,我想显示一个 progressDialog,直到建立连接。

这是我在客户端的代码:

private string login()
{
    string x = null;
    var progress = ProgressDialog.Show(this, "waiting", "Loading");
    progress.SetProgressStyle(ProgressDialogStyle.Spinner);
    new Thread(new ThreadStart(delegate
    {
        RunOnUiThread(async () =>
        {
            x = await services.Verification("abc", "xyz");
            progress.Dismiss();
        });
     })).Start();

    return x;
}

在服务器端:

public string Verification(string userName, string password)
{
    SqlConnection conn = new SqlConnection(@"");
    conn.Open();
    string query = "select category from ACCOUNTS where loginId = '" + userName + "' and pasword= '" + password + "'";
    SqlCommand cmd = new SqlCommand(query);
    cmd.Connection = conn;
    string catagory = null;
    SqlDataReader account = cmd.ExecuteReader();

    if (account.HasRows)
    {
        if (account.Read())
        {
            catagory = account[0].ToString();
        }
    }
    conn.Close();

    return catagory;
}

这是x = await services.Verification("abc", "xyz"); 行的 login() 函数中的错误,它说:

 'String' does not contain a definition for 'GetAwaiter' and no extension method 'GetAwaiter' accepting a first argument of type 'String' could be found (are you missing a using directive or an assembly reference?)

【问题讨论】:

  • 正如错误试图告诉你的那样,你不能等待string。您需要使用一些实际的异步 API。
  • 像什么?我是新手.....请帮助!
  • and pasword= '" + password + "'" - 我只是……我只是……无语。出于对 Internet 的热爱,在将其投入生产之前接受一些安全培训。 Tony Hunt 有一个 great video 可用。

标签: c# android xamarin visual-studio-2015 xamarin.android


【解决方案1】:

要使用这个:

x = await services.Verification("abc", "xyz");

您必须使用如下 API:

public async Task<string> Verification(string userName, string password)

但是,您使用什么来与数据库通信?看起来您是直接调用 Verification 方法,而不是通过 REST 调用服务。部署应用程序时直接调用该方法将不起作用...您需要使用 HttpClient 和 async/await、RestSharp 或本教程中定义的其他方法调用 Web 服务的代理:https://developer.xamarin.com/guides/cross-platform/application_fundamentals/web_services/

取自here

var httpClient = new HttpClient();
Task<string> contentsTask = httpClient.GetStringAsync("http://xamarin.com"); 

string contents = await contentsTask;

【讨论】:

  • 我正在使用 WEB SERVICES (ASMX) n 服务器在 Azure 上,正如您在使用后所说,错误是 ''TaskOfString' 不包含 'GetAwaiter' 的定义并且没有扩展方法 'GetAwaiter ' 可以找到接受类型为 'TaskOfString' 的第一个参数(您是否缺少 using 指令或程序集引用?) ' 请帮助!!
  • 您上面指出的示例不可等待,因为它首先没有实现异步 Task。但是,您是否设置了代理或其他内容?因为我在使用Xamarin连接的时候,需要使用上面提到的代码示例,但是使用httpClient.GetStringAsync("HTTP PATH TO WEB SERVICE ON SERVER");
  • 我正在向我的代码中添加网络引用(ASMX)...here you can see 你能帮我怎么做吗...制作一个实现“异步”的“等待”
  • 好吧,我的错。如上所述,您是否尝试使用 Task 制作 Web 服务?试试看代理是否假设。
  • 是的,我试过了.....同样的错误,但这次“TaskOfString”'TaskOfString 不包含'GetAwaiter'的定义,并且没有扩展方法'GetAwaiter'接受类型'的第一个参数可以找到 TaskOfString'(您是否缺少 using 指令或程序集引用?)'
猜你喜欢
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多