[英]Xamarin.Forms GetAsync stops debugging without error
我的MainPage后台代码:
private void Button_Clicked(object sender, EventArgs e)
{
Query().Wait();
App.Current.MainPage = new Categories();
}
public async Task Query()
{
restaurantsClient = (App.Current as App).restaurantsClient;
try
{
var restaurantsNames = await restaurantsClient.GetCatalogsAsync(1);
}
catch (Exception ex)
{
var x = 0;
}
}
我也尝试过此代码,但是没有用,发生同样的问题:
async static Task GetRequest(String URL)
{
using (HttpClient client = new HttpClient())
{
// As soon as I try to step over (or even into) this next line, it crashes.
using (HttpResponseMessage response = await client.GetAsync(URL))
{
using (HttpContent content = response.Content)
{
string data = await content.ReadAsStringAsync();
Console.WriteLine(data);
}
}
}
}
C#中的Rest-API:
var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
当项目到达此行时,它只是死掉而没有显示任何错误。 如果我在浏览器中执行此操作,它将正常工作。 该API在我的PC上本地运行(我正在使用Conveyor公开API)。
好的,我制作了一个视频,以更好地了解我在说什么: https : //youtu.be/ONKTipPsEXI如您所见,在单击响应行中的下一步后,停止执行其余代码。
这是因为您在UI线程上使用Task
的Button.Clicked
.Wait()
(UI线程上处理了Button.Clicked
事件),从而导致死锁。 任务正在等待UI线程给予控制权,而UI线程正在等待任务完成 。 解决方案是在事件处理程序中添加async
修饰符,并使用await Query()
代替Query().Wait()
。
private async void Button_Clicked(object sender, EventArgs e)
{
await Query();
App.Current.MainPage = new Categories();
}
我还建议您阅读Stephen Cleary的 这篇文章 。 此外,他制作了关于C#任务的精彩系列( A Tour of Task )。
更新:
在OP的问题更新并在此答案的评论中进行讨论之后; 他认为这是有问题的,因为他可以在GetCatalogsAsync(int, CancellationToken)
结束之前到达GetCatalogsAsync(int)
的结尾。 这是完全自然的,是可以预期的。 解:
public async System.Threading.Tasks.Task<CatalogsInCategory> GetCatalogsAsync(int id)
{
return await GetCatalogsAsync(id, System.Threading.CancellationToken.None);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.