c# – 异步后调试器在visual studio中调用HttpClient.GetAsync()

前端之家收集整理的这篇文章主要介绍了c# – 异步后调试器在visual studio中调用HttpClient.GetAsync()前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图测试下面的http请求方法
  1. public async Task<HttpContent> Get(string url)
  2. {
  3. using (HttpClient client = new HttpClient())
  4. // breakpoint
  5. using (HttpResponseMessage response = await client.GetAsync(url))
  6. // can't reach anything below this point
  7. using (HttpContent content = response.Content)
  8. {
  9. return content;
  10. }
  11. }

但是,调试器似乎正在跳过第二个评论下面的代码.我正在使用Visual studio 2015 RC,有什么想法?我也尝试检查任务窗口,没有看到

编辑:找到解决方

  1. using System;
  2. using System.Net.Http;
  3. using System.Threading.Tasks;
  4.  
  5. namespace ConsoleTests
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. Program program = new Program();
  12. var content = program.Get(@"http://www.google.com");
  13. Console.WriteLine("Program finished");
  14. }
  15.  
  16. public async Task<HttpContent> Get(string url)
  17. {
  18. using (HttpClient client = new HttpClient())
  19. using (HttpResponseMessage response = await client.GetAsync(url).ConfigureAwait(false))
  20. using (HttpContent content = response.Content)
  21. {
  22. return content;
  23. }
  24. }
  25. }
  26. }

原来,因为这是一个C#控制台应用程序,它在主线程结束之后结束,我猜是因为在添加一个Console.ReadLine()并等待一下后,请求确实返回.我猜C#会等到我的任务执行,而不是在它之前结束,但我想我错了.如果有人可以详细说明为什么会发生这样的事情会很好.

解决方法

当主出口时,程序退出.任何未完成的异步操作将被取消,并将其结果丢弃

因此,您需要阻止Main退出,无论是通过阻止异步操作或其他一些方法(例如,调用Console.ReadKey来阻止用户命中一个键):

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

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

  1. static void Main(string[] args)
  2. {
  3. MainAsync().Wait();
  4. }
  5.  
  6. static async Task MainAsync()
  7. {
  8. try
  9. {
  10. Program program = new Program();
  11. var content = await program.Get(@"http://www.google.com");
  12. Console.WriteLine("Program finished");
  13. }
  14. catch (Exception ex)
  15. {
  16. Console.WriteLine(ex);
  17. }
  18. }

请注意,阻塞异步代码通常被认为是一个坏主意;应该做的很少的情况,控制台应用程序的Main方法恰好恰好是其中之一.

猜你在找的C#相关文章