为什么我的调试器似乎停留在await语句中?

时间:2019-02-05 02:11:54

标签: c# visual-studio-2017 visual-studio-debugging

我对此并不陌生,所以请多多包涵。我正在调试并在线路上遇到问题:

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

3 个答案:

答案 0 :(得分:5)

  

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

这听起来像是一个僵局。由于这是一个UI应用程序,因此请进一步检查您的呼叫堆栈是否有Wait()ResultGetAwaiter().GetResult()之类的阻塞呼叫。这些可以deadlock if called from the UI thread

正确的解决方案是将它们更改为await;换句话说,请使用async all the way

答案 1 :(得分:0)

Await运算符以这种方式工作,当您等待任务时,代码执行将跳出当前函数并将控制权交给其调用者。然后,当等待的任务完成时,它将在await语句之后跳回以执行代码。

在您的情况下: 等待操作符将暂停执行,直到“ client.GetAsync(uri)”方法的工作完成为止。同时,控制权返回给FetchDataAsync的调用方。任务完成执行后,await表达式将计算为响应。

如果您在等待评估响应后走了一步,调试器将导航到下一步,如果等待未返回,则调试器的突出显示将丢失。

答案 2 :(得分:0)

使用邮递员(https://www.getpostman.com/)首先测试URL。如果邮递员可以获取数据,则您的客户端应用程序有问题。否则,Web api将无法正常工作。