【发布时间】:2016-07-29 13:48:56
【问题描述】:
我正在开发一个 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;
}
}
我错过了什么吗?谢谢。
【问题讨论】:
-
通过调用 Task.Wait 或 Task.Result 来阻塞异步代码通常是个坏主意。 msdn.microsoft.com/en-us/magazine/jj991977.aspx
-
谢谢乔恩。我从这篇文章中学到了很多东西。
标签: c# asynchronous xamarin xamarin.android async-await