C# Forms GetAsync停止调试,没有错误

C# Forms GetAsync停止调试,没有错误,c#,android,xamarin.forms,httpclient,C#,Android,Xamarin.forms,Httpclient,我的主页代码隐藏: 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 {

我的主页代码隐藏:

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:

当项目到达这条线时,它就死了,没有显示任何错误。 如果我在浏览器中这样做,它就会工作。 API在我的PC中本地运行(我使用传送带公开API)

好的,我制作了一个视频,以便更好地了解我所说的内容:
正如我在响应行中单击“下一步”后所看到的,停止执行其余代码。

这是因为您正在UI线程上使用任务的
.Wait()
按钮。单击的
事件在UI线程上处理)导致死锁。任务正在等待UI线程给予它控制权,UI线程正在等待任务完成。解决方法是将
async
修饰符添加到事件处理程序中,并使用
Wait Query()
而不是
Query().Wait()

我还推荐斯蒂芬·克利里(Stephen Cleary)读一读关于这件事的书。此外,他还制作了一个关于C#任务的精彩系列()

更新:

在OP的问题更新和本答案评论中的讨论之后;他认为这是一个问题,因为他可以在
GetCatalogsAsync(int)的末尾之前到达
GetCatalogsAsync(int,CancellationToken)
的末尾。这是完全自然的,也是意料之中的。解决方案:

public async System.Threading.Tasks.Task<CatalogsInCategory> GetCatalogsAsync(int id)
{
    return await GetCatalogsAsync(id, System.Threading.CancellationToken.None);
}
public async System.Threading.Tasks.Task GetCatalogsAsync(int-id)
{
return wait-GetCatalogsAsync(id,System.Threading.CancellationToken.None);
}

Android死亡的问题已经解决,但是到达响应行而不执行其余代码的问题仍然存在。我添加了一个视频来显示问题中发生了什么,去检查一下。@LOLJovem我看了视频。在try(
var headers_=…
)内的第一行添加断点时会发生什么情况?在“Telerik is trial”对话框中按
OK
后,它是否被击中?但是try中的var头位于响应行下方,因此永远不会执行,因为当项目到达该行时,不会执行更多的代码。通过“But”,你推断它被击中,然后你说它从未执行过。那么,它是不是被击中了?
private async void Button_Clicked(object sender, EventArgs e)
{
    await Query();
    App.Current.MainPage = new Categories();
}
public async System.Threading.Tasks.Task<CatalogsInCategory> GetCatalogsAsync(int id)
{
    return await GetCatalogsAsync(id, System.Threading.CancellationToken.None);
}