当前位置: 首页 > 知识库问答 >
问题:

调试器在异步HttpClient后停止。GetAsync()调用视觉工作室

杜联
2023-03-14

我正在尝试测试下面的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#控制台应用程序,所以我猜它在主线程结束后结束,因为在添加控制台之后。ReadLine()并等待一段时间,请求确实返回了。我猜想C#会等到我的任务执行后才结束,但我想我错了。如果有人能详细说明为什么会发生这种情况,那就太好了。

共有1个答案

乐正心水
2023-03-14

Main退出时,程序退出。任何未完成的异步操作都将被取消,其结果将被丢弃。

因此,您需要阻止Main退出,可以通过阻止异步操作,也可以通过其他方法(例如,调用Console.ReadKey阻止,直到用户点击某个键):

static void Main(string[] args)
{
  Program program = new Program();
  var content = program.Get(@"http://www.google.com").Wait();
  Console.WriteLine("Program finished");
}

一种常见的方法是定义一个执行异常处理的Main Async

static void Main(string[] args)
{
  MainAsync().Wait();
}

static async Task MainAsync()
{
  try
  {
    Program program = new Program();
    var content = await program.Get(@"http://www.google.com");
    Console.WriteLine("Program finished");
  }
  catch (Exception ex)
  {
    Console.WriteLine(ex);
  }
}

注意,在异步代码上阻塞通常被认为是一个坏主意;很少有情况需要这样做,而控制台应用程序Main方法恰好就是其中之一。

 类似资料:
  • 我的程序需要允许用户输入员工姓名和年度总销售额。当用户完成将员工添加到阵列中时,程序应确定哪些员工的销售额最高,哪些员工的销售量最低。然后,它应该打印出两个数字之间的差异。 在我下面的代码中,我有一个保存用户输入的年销售额的totalPay类(它包括以前赋值中的其他变量和方法,这里没有使用)。salesPerson类保存雇员的姓名和totalPay对象,其中包括他们的年销售额。(我意识到这太复杂了

  • 问题内容: 有时,当我调用Selenium FindElements(By)时,它将引发异常,并且驱动程序停止工作。参数“ BY”可能是问题所在:当我使用其他BY搜索相同的元素时,它起作用了。 我也可以看到,即使我的元素存在,或者之前曾调用过带有相同参数的相同方法,也不会阻止该方法引发异常。 我的方法是: 一个BY值的示例并非始终有效(即使它存在于页面中): 例外: WebDriverExcept

  • 在以前版本的Visual Studio(或者我几年前设置的一些设置)中,当我停止调试Web应用程序时,实际的IIS Express实例将继续运行。我真的很喜欢这种行为,因为这意味着当我编辑代码/重新编译ect时,站点总是在运行以进行修补。 自从升级到VS 2013后,这种情况似乎不再发生,当我停止调试时,它也停止了IIS express应用程序池。 有没有人知道某处有没有改变这种行为的设定?

  • 下面的代码有一个TaskMonitor类,它是Stephen Cleary的NotifyTask类的修改版本。Worker类使用TaskMonitor类异步运行Worker.CheckStatus。 Worker.CheckStatus经常会引发异常(例如数据库连接问题)。我希望TaskMonitor.Monitor阻止异常到达Program.Main并通过Exception和InnerExcep