【发布时间】:2015-07-07 23:23:38
【问题描述】:
我正在尝试测试以下 http 请求方法
public async Task<HttpContent> Get(string url)
{
using (HttpClient client = new HttpClient())
// breakpoint
using (HttpResponseMessage response = await client.GetAsync(url))
// can't reach anything below this point
using (HttpContent content = response.Content)
{
return content;
}
}
但是,调试器似乎正在跳过第二条注释下方的代码。我正在使用 Visual Studio 2015 RC,有什么想法吗?我还尝试检查“任务”窗口,但什么也没看到
编辑:找到解决方案
using System;
using System.Net.Http;
using System.Threading.Tasks;
namespace ConsoleTests
{
class Program
{
static void Main(string[] args)
{
Program program = new Program();
var content = program.Get(@"http://www.google.com");
Console.WriteLine("Program finished");
}
public async Task<HttpContent> Get(string url)
{
using (HttpClient client = new HttpClient())
using (HttpResponseMessage response = await client.GetAsync(url).ConfigureAwait(false))
using (HttpContent content = response.Content)
{
return content;
}
}
}
}
事实证明,因为这是一个 C# 控制台应用程序,我猜它在主线程结束后结束,因为在添加了 Console.ReadLine() 并稍等片刻之后,请求确实返回了。我猜 C# 会等到我的任务执行而不是在它之前结束,但我想我错了。如果有人能详细说明为什么会发生这种情况,那就太好了。
【问题讨论】:
-
这是因为你有另一个异步方法
client.GetAsync(url)。您也应该在该方法中添加断点。 -
我应该在哪里添加断点?我尝试在每一行上添加断点,即使是在将我的 Get 方法调用为 await 的那一行上,但调试器仍然会跳过我的第二个 GetAsync 调用之外的任何内容。
-
@sgarcia:我相信这个问题是重复的。但是,如果这不正确,请告诉我,我会重新打开。
-
@StephenCleary 我看到了这个问题,但是当我在答案中看到 ASP.NET 时,我猜这不适用于我的问题,因为我是在 C# 控制台应用程序上执行此操作的。我现在会检查一下,但如果您指出的问题不适用于 C# 控制台应用程序,请也告诉我。
-
@sgarcia:听起来您的应用程序在退出之前没有等待。您需要阻止
Main退出。喜欢p.Get().Wait();或p.Get(); Console.ReadKey();。
标签: c# asynchronous async-await visual-studio-2015