为什么我的调试器出现在的await语句被卡住?

问题描述 投票:-1回答:3

我是新来的这一点,所以请多多包涵。我调试,并具有与该行的问题:

var response = await client.GetAsync(uri);

所以它以最小的,完整的,可验证和符合比如我编辑的问题。

我一步了这句话的调试器,以便在下一语句移动,但对于原因还不得而知对我来说,调试器似乎丢失,无法恢复。

每次我打了电话await和逐步结束,它只是发生的每一次。调试器断点就会消失。

以下是所有的代码:

public class App : Application // superclass new in 1.3
{
    public App ()
    {
        MainPage = new PinPage { Title = "Pins", Icon = "marker.png" };
    }
}

public class PinPage : ContentPage
{
    private async Task FetchDataAsync()
    {
        HttpClient client = new HttpClient();
        string resultUrl = "http://myuser.gtempurl.com/Service1.svc/GetLocations";
        var uri = new Uri(string.Format(resultUrl, string.Empty));
        var response = await client.GetAsync(uri);
        if (response.IsSuccessStatusCode)
        {
            string content = await response.Content.ReadAsStringAsync();
            var obj = JsonConvert.DeserializeObject(content);
        }

    }
    public PinPage ()
    {
        FetchDataAsync().GetAwaiter().GetResult();
    }
}

WCF服务不是问题。这是发表在一个公共的服务器,所以它总是可用。我把它从一个浏览器并返回预期的字符串。

我使用VS2017和它在Android模拟器调试。

下面是当断点命中声明的屏幕截图:

enter image description here

c# visual-studio-2017 visual-studio-debugging
3个回答
5
投票

它不会移动到下一行。代码没有其他行以黄色高亮显示,没有超时,没有什么。

这听起来像一个僵局。由于这是一个UI应用程序,进一步检查您的通话栈像Wait()Result,或GetAwaiter().GetResult()任何阻塞调用。这些可以deadlock if called from the UI thread

正确的解决办法是改变他们await;换句话说,使用async all the way


0
投票

等待运营商以这种方式工作,当你等待一个任务的执行代码会跳出当前函数和产量控制它的调用者。然后,当期待已久的任务完成后,它会跳回来等待语句后执行代码。

你的情况:该运营商的await执行暂停,直到“client.GetAsync(URI)”方法的工作就完成了。在此期间,控制返回到FetchDataAsync的调用者。当任务完成执行,则等待表达式求的响应。

如果你迈过的await评估了响应后,调试器将导航到下一个步骤,如果AWAIT还没有回到调试器的亮点是丢失。


0
投票

使用邮差(https://www.getpostman.com/)首先测试的URL。如果邮差能得到的数据,有什么不对的,你的客户端应用程序。否则,web API是行不通的。

© www.soinside.com 2019 - 2024. All rights reserved.