为什么我的调试器似乎卡在 await 语句中?
Why my debugger appears to be stuck at an await statement?
我是新手,所以请多多包涵。我正在调试并遇到问题:
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 服务不是问题所在。它发布在 public 服务器上,因此始终可用。我从浏览器调用它,它 returns 预期的字符串。
我正在使用 VS2017,它在 Android 模拟器中进行调试。
这是断点命中语句:
时的屏幕截图
await 运算符就是这样工作的,当你等待一个任务时,代码执行将跳出当前函数并将控制权交给它的调用者。然后当等待的Task完成后,会跳回执行await语句后的代码。
你的情况:
await 运算符暂停执行,直到 "client.GetAsync(uri) " 方法的工作完成。同时,控制权返回给 FetchDataAsync 的调用者。当任务完成执行时,等待表达式计算为响应。
如果您在 await 评估响应后跳过,调试器将导航到下一步,如果 await 未返回,则调试器的突出显示将丢失。
首先使用 Postman (https://www.getpostman.com/) 测试 URL。如果邮递员可以获取数据,则说明您的客户端应用程序有问题。否则,网络 api 无法正常工作。
it does not move to the next line. No other line of code is highlighted yellow, no timeout, nothing.
这听起来像是一个僵局。由于这是一个 UI 应用程序,请进一步检查您的调用堆栈是否有任何阻塞调用,例如 Wait()
、Result
或 GetAwaiter().GetResult()
。这些可以deadlock if called from the UI thread.
正确的解决办法是将它们改为await
;换句话说,使用 async
all the way.
我是新手,所以请多多包涵。我正在调试并遇到问题:
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 服务不是问题所在。它发布在 public 服务器上,因此始终可用。我从浏览器调用它,它 returns 预期的字符串。
我正在使用 VS2017,它在 Android 模拟器中进行调试。
这是断点命中语句:
时的屏幕截图await 运算符就是这样工作的,当你等待一个任务时,代码执行将跳出当前函数并将控制权交给它的调用者。然后当等待的Task完成后,会跳回执行await语句后的代码。
你的情况: await 运算符暂停执行,直到 "client.GetAsync(uri) " 方法的工作完成。同时,控制权返回给 FetchDataAsync 的调用者。当任务完成执行时,等待表达式计算为响应。
如果您在 await 评估响应后跳过,调试器将导航到下一步,如果 await 未返回,则调试器的突出显示将丢失。
首先使用 Postman (https://www.getpostman.com/) 测试 URL。如果邮递员可以获取数据,则说明您的客户端应用程序有问题。否则,网络 api 无法正常工作。
it does not move to the next line. No other line of code is highlighted yellow, no timeout, nothing.
这听起来像是一个僵局。由于这是一个 UI 应用程序,请进一步检查您的调用堆栈是否有任何阻塞调用,例如 Wait()
、Result
或 GetAwaiter().GetResult()
。这些可以deadlock if called from the UI thread.
正确的解决办法是将它们改为await
;换句话说,使用 async
all the way.