Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Xamarin.Android上使用async/await仍然会阻塞用户界面_C#_Asynchronous_Xamarin_Xamarin.android_Async Await - Fatal编程技术网

C# 在Xamarin.Android上使用async/await仍然会阻塞用户界面

C# 在Xamarin.Android上使用async/await仍然会阻塞用户界面,c#,asynchronous,xamarin,xamarin.android,async-await,C#,Asynchronous,Xamarin,Xamarin.android,Async Await,我正在从事一个Xamarin.Android项目,该应用程序需要在更新UI之前使用web服务。我应用了async/await,但它仍然阻塞了UI 这是用户界面代码 private async void Login(object sender, EventArgs e) { var username = _usernamEditText.Text.Trim(); var password = _passwordEditText.Text.Trim()

我正在从事一个Xamarin.Android项目,该应用程序需要在更新UI之前使用web服务。我应用了async/await,但它仍然阻塞了UI

这是用户界面代码

    private async void Login(object sender, EventArgs e)
    {
        var username = _usernamEditText.Text.Trim();
        var password = _passwordEditText.Text.Trim();
        var progressDialog = ProgressDialog.Show(this, "", "Logging in...");
        var result = await _userService.AuthenticateAsync(username, password);

        progressDialog.Dismiss();
    }
这是服务代码

public async Task<AuthenticationResult> AuthenticateAsync(string username, string password)
    {
        using (var httpClient = CreateHttpClient())
        {
            var url = string.Format("{0}/token", Configuration.ServiceBaseUrl);
            var body = new List<KeyValuePair<string, string>>
            {
                new KeyValuePair<string, string>("username", username),
                new KeyValuePair<string, string>("password", password),
                new KeyValuePair<string, string>("grant_type", "password")
            };
            var response = httpClient.PostAsync(url, new FormUrlEncodedContent(body)).Result;
            var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
            var obj = new JSONObject(content);
            var result = new AuthenticationResult {Success = response.IsSuccessStatusCode};

            if (response.IsSuccessStatusCode)
            {
                result.AccessToken = obj.GetString("access_token");
                result.UserName = obj.GetString("userName");
            }
            else
            {
                result.Error = obj.GetString("error");

                if (obj.Has("error_description"))
                {
                    result.ErrorDescription = obj.GetString("error_description");
                }
            }

            return result;
        }
    }
public异步任务AuthenticateAsync(字符串用户名、字符串密码)
{
使用(var httpClient=CreateHttpClient())
{
var url=string.Format(“{0}/token”,Configuration.ServiceBaseUrl);
var body=新列表
{
新的KeyValuePair(“用户名”,用户名),
新的KeyValuePair(“密码”,password),
新的KeyValuePair(“授权类型”、“密码”)
};
var response=httpClient.PostAsync(url,新表单UrlEncodedContent(body)).Result;
var content=await response.content.ReadAsStringAsync().ConfigureAwait(false);
var obj=新的JSONObject(内容);
var result=newauthenticationresult{Success=response.issucessStatusCode};
if(响应。IsSuccessStatusCode)
{
result.AccessToken=obj.GetString(“访问令牌”);
result.UserName=obj.GetString(“用户名”);
}
其他的
{
result.Error=obj.GetString(“Error”);
如果(对象有(“错误描述”))
{
result.ErrorDescription=obj.GetString(“错误描述”);
}
}
返回结果;
}
}

我错过什么了吗?谢谢。

您不是在等待
PostAsync
,您只是在获取
结果。这使得调用同步

将该行更改为wait,它将异步运行

        var response = await httpClient.PostAsync(url, new FormUrlEncodedContent(body));

通过调用Task.Wait或Task.Result来阻止异步代码通常是个坏主意。谢谢你,乔恩。我从这篇文章中学到了很多。谢谢萨米。它解决了这个问题。