【问题标题】:Why my debugger appears to be stuck at an await statement?为什么我的调试器似乎卡在等待语句中?
【发布时间】:2019-06-28 19:56:16
【问题描述】:

我是新手,所以请多多包涵。我正在调试并遇到问题:

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 模拟器中进行调试。

这是断点命中语句时的屏幕截图

【问题讨论】:

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


【解决方案1】:

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

这听起来像是一个僵局。由于这是一个 UI 应用程序,请进一步检查您的调用堆栈中是否存在任何阻塞调用,例如 Wait()ResultGetAwaiter().GetResult()。这些可以deadlock if called from the UI thread

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

【讨论】:

  • 谢谢。我已经编辑了问题以包含一个完整的示例。
  • @fdkgfosfskjdlsjdlkfsf:问题出在.GetAwaiter().GetResult() 行。
  • 再次感谢。有没有简单的解决方案?
  • @fdkgfosfskjdlsjdlkfsf:看起来您正在将数据加载到 UI ViewModel 中,所以我建议您使用 this kind of asynchronous data binding
【解决方案2】:

Await 操作符就是这样工作的,当你 await 一个任务时,代码执行会跳出当前函数,并将控制权交给它的调用者。然后当等待的Task完成后,会跳回执行await语句之后的代码。

在你的情况下: await 运算符暂停执行,直到“client.GetAsync(uri)”方法的工作完成。同时,控制权返回给 FetchDataAsync 的调用者。当任务完成执行时,await 表达式的计算结果为响应。

如果您在 await 评估响应后跳过,调试器将导航到下一步,如果 await 没有返回,则调试器的突出显示丢失。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多