Visual Studio 2015异步变量未在调试器中显示

时间:2016-09-09 21:11:15

标签: asp.net-mvc visual-studio-2015 asp.net-core

我有一个.NET Core ASP.NET MVC 6应用程序,我确信它是Visual Studio中的一个错误。如果我在await语句后面放置一个断点,那么该对象不会显示在Locals中,并且我无法鼠标移动来检查。但是,如果我使用变量,它仍然可以正常工作,并且它确实填充了。

这么简单:

public async Task<IActionResult> Index()
    {
        var location = await _listingLocationService.GetLocationByAddress("123 Fake Street");
        return Content(location.Latitude.ToString() + " " +location.Longitude.ToString());
    }

如果我将断点放在return语句上,我无法检查位置。它并没有出现在任何地方。我甚至可以删除await&amp;放置一个。结果,但仍然没有显示。但是当我继续时,视图会显示location.latitude,并且location.longitude会很好。所以我知道它已被填充。

为了完整起见,我还要包含GetLocationByAddress函数,这也是同样的事情,如果我在等待之后的任何地方放置一个断点,我就无法检查变量(甚至是反序列化的)列出!)。

public async Task<Geolocation> GetLocationByAddress(string address)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("https://maps.googleapis.com/maps/api/geocode/json");
                var request = new HttpRequestMessage(HttpMethod.Get, "?address=" + WebUtility.UrlEncode(address) + "&key=...");
                var response = await client.SendAsync(request);
                var contents = await response.Content.ReadAsStringAsync();
                var locationResult = JsonConvert.DeserializeObject<GoogleLocationResult>(contents);
                if (locationResult.status == "OK")
                {
                    var result = locationResult.results.First().geometry.location;
                    return new Geolocation
                    {
                        Latitude = result.lat,
                        Longitude = result.lng
                    };
                }
                else
                {
                    return null;
                }
            }
        }

2 个答案:

答案 0 :(得分:5)

嗯,在这个问题失去了一整天之后,我终于找到了问题的根源以及解决方案...... 在我的情况下,在更新我的项目以使用.net核心1.1预览1后,问题已经开始,遵循此处显示的步骤:Link to MSFT .NET Blog

问题是由project.json文件中的这行代码引起的:

"buildOptions": {
  "debugType": "portable",   <---- THIS
  "preserveCompilationContext": true,
  "emitEntryPoint": true
}

将“debugType”设置为“full”后,等待变量在调试时再次开始显示。

希望有人能帮助你!

答案 1 :(得分:-2)

这不是一个错误。当调试器到达返回行时,这是因为前一行立即返回了一个Task对象。你的GetLocation方法还没有运行(这是有意义的,因为它正在进行出站HTTP调用,它将花费的时间超过返回任务所花费的毫秒数)。当您点击返回行时,您的调试器已停在那里,但未完成的任务意味着该位置将不会就绪。放置断点的更好位置可能在GetLocation方法的返回行中。

顺便说一句,如果对Google地图的调用失败,您的操作方法会出现空引用错误。