Xamarin.Forms GetAsync停止调试且没有错误

时间:2019-06-09 13:28:12

标签: c# android xamarin.forms httpclient

我的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 如您所见,我在响应行中单击“下一步”后,停止执行其余代码。

1 个答案:

答案 0 :(得分:1)

那是因为您在UI线程上使用.Wait()的{​​{1}}(UI线程处理了Task事件),导致死锁。 任务正在等待UI线程给予控制权,而UI线程正在等待任务完成。解决方案是在事件处理程序中添加Button.Clicked修饰符,并使用async代替await Query()

Query().Wait()

我还建议阅读 Stephen Cleary this article,以解决此问题。此外,他制作了一系列有关C#任务的精彩文章(A Tour of Task)。

更新:

更新OP的问题并在此答案的评论中进行讨论之后;他认为这是有问题的,因为他可以在private async void Button_Clicked(object sender, EventArgs e) { await Query(); App.Current.MainPage = new Categories(); } 的结尾之前到达GetCatalogsAsync(int)的结尾。这是完全自然的,是可以预期的。解决方案:

GetCatalogsAsync(int, CancellationToken)