【问题标题】:Xamarin.Forms GetAsync stops debugging without errorXamarin.Forms GetAsync 停止调试且没有错误
【发布时间】:2019-06-09 13:28:12
【问题描述】:

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

【问题讨论】:

    标签: c# android xamarin.forms httpclient


    【解决方案1】:

    那是因为您在 UI 线程上使用 Task.Wait()Button.Clicked 事件在 UI 线程上处理)导致死锁。 任务正在等待 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 撰写的 this article 来了解此事。此外,他还制作了一个关于 C# 任务的精彩系列 (A Tour of Task)。

    更新:

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

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

    【讨论】:

    • 安卓死机问题解决了,但是到达响应行不执行其余代码的问题依然存在。
    • 我添加了一个视频来显示问题中发生的事情去看看。
    • @LOLJovem 我看了视频。当你在 try (var headers_ = ...) 内的第一行添加断点时会发生什么?在“Telerik is trial”对话框中按OK 后它会被击中吗?
    • 但是 try 中的 var 标头位于响应行下方,因此永远不会执行,因为当项目到达该行时不会执行更多代码。
    • 通过“但是”你推断它被击中,然后你说它从未被执行。那么,它是否被击中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2017-03-08
    • 1970-01-01
    • 2016-06-22
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多