从 android 应用程序调用 Azure web api 在等待响应时永远挂起
Call to Azure web api from android application just hangs forever while awaiting for response
我已经向 Azure 发布了一个非常基本的 asp.net Web api 代码,该代码随模板一起提供。当我尝试默认的 GET 操作时,我得到 JSON 响应 ["value1","value2"]
当我尝试从我的 xamarin-android 项目进行相同的调用时,执行在等待响应时永远挂起(参见下面的代码)。
我正在使用 visual studio 2015。我连接了我的 phone 进行调试。
button.Click += onButtonClick;
}
private void onButtonClick(object sender, EventArgs e)
{
GetValuesSync().Wait();
}
private async Task GetValuesSync()
{
string ResponseJsonString = null;
string url =
"http://myWebapp.azurewebsites.net/api/values";
using (var httpClient = new HttpClient())
{
try
{
Task<HttpResponseMessage> getResponse = httpClient.GetAsync(url);
HttpResponseMessage response = await getResponse; //Execution hangs here forever ...
ResponseJsonString = await response.Content.ReadAsStringAsync();
values = JsonConvert.DeserializeObject<string[]>(ResponseJsonString);
}
catch (Exception ex)
{
throw;
}
}
}
感谢您的帮助
最好让异步工作流保持异步。强行使其同步实际上会阻塞您的 UI 线程,并且该应用程序将失去其响应能力。
如果你尝试这样的事情会怎样:
private async void onButtonClick(object sender, EventArgs e)
{
await GetValuesAsync();
}
private async Task GetValuesAsync()
{
string ResponseJsonString = null;
string url =
"http://myWebapp.azurewebsites.net/api/values";
using (var httpClient = new HttpClient())
{
try
{
Task<HttpResponseMessage> getResponse = httpClient.GetAsync(url);
HttpResponseMessage response = await getResponse; //Execution hangs here forever ...
ResponseJsonString = await response.Content.ReadAsStringAsync();
values = JsonConvert.DeserializeObject<string[]>(ResponseJsonString);
}
catch (Exception ex)
{
throw;
}
}
}
我希望 values
没有附加到 UI,否则您可能必须访问 UI 线程才能更新它。
除了上述答案之外,作为最佳实践,请始终尝试指定应在哪个线程上调用 await 之后的延续。在您的情况下,显式调用 ConfigureAwait(false) 也应该可以解决死锁问题。
我已经向 Azure 发布了一个非常基本的 asp.net Web api 代码,该代码随模板一起提供。当我尝试默认的 GET 操作时,我得到 JSON 响应 ["value1","value2"]
当我尝试从我的 xamarin-android 项目进行相同的调用时,执行在等待响应时永远挂起(参见下面的代码)。
我正在使用 visual studio 2015。我连接了我的 phone 进行调试。
button.Click += onButtonClick;
}
private void onButtonClick(object sender, EventArgs e)
{
GetValuesSync().Wait();
}
private async Task GetValuesSync()
{
string ResponseJsonString = null;
string url =
"http://myWebapp.azurewebsites.net/api/values";
using (var httpClient = new HttpClient())
{
try
{
Task<HttpResponseMessage> getResponse = httpClient.GetAsync(url);
HttpResponseMessage response = await getResponse; //Execution hangs here forever ...
ResponseJsonString = await response.Content.ReadAsStringAsync();
values = JsonConvert.DeserializeObject<string[]>(ResponseJsonString);
}
catch (Exception ex)
{
throw;
}
}
}
感谢您的帮助
最好让异步工作流保持异步。强行使其同步实际上会阻塞您的 UI 线程,并且该应用程序将失去其响应能力。
如果你尝试这样的事情会怎样:
private async void onButtonClick(object sender, EventArgs e)
{
await GetValuesAsync();
}
private async Task GetValuesAsync()
{
string ResponseJsonString = null;
string url =
"http://myWebapp.azurewebsites.net/api/values";
using (var httpClient = new HttpClient())
{
try
{
Task<HttpResponseMessage> getResponse = httpClient.GetAsync(url);
HttpResponseMessage response = await getResponse; //Execution hangs here forever ...
ResponseJsonString = await response.Content.ReadAsStringAsync();
values = JsonConvert.DeserializeObject<string[]>(ResponseJsonString);
}
catch (Exception ex)
{
throw;
}
}
}
我希望 values
没有附加到 UI,否则您可能必须访问 UI 线程才能更新它。
除了上述答案之外,作为最佳实践,请始终尝试指定应在哪个线程上调用 await 之后的延续。在您的情况下,显式调用 ConfigureAwait(false) 也应该可以解决死锁问题。