2013-08-08 2 views
3

Выполняя этот простой небольшой тест на Mono (3.2.1) в Mac OS X, он никогда не печатает никакой ответ на консоль, но вместо этого говорит Shutting down finalizer thread timed out.
С этим кодом или с моим кодом что-то не так Моно плохое поведение?Простой тест HttpClient на Mono

using System; 
using System.Net.Http; 

namespace VendTest 
{ 
    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      Client client = new Client(); 
      client.HttpClientCall(); 
     } 
    } 

    public class Client 
    { 
     HttpClient client; 

     public Client() 
     { 
      client = new HttpClient(); 
     } 

     public async void HttpClientCall() 
     { 
      HttpClient httpClient = new HttpClient(); 
      HttpResponseMessage response = await httpClient.GetAsync("http://vendhq.com"); 
      string responseAsString = await response.Content.ReadAsStringAsync(); 
      Console.WriteLine(responseAsString); 
     } 
    } 
} 

ответ

7

Вы должны почти никогда не использовать методы async void, и это одна из причин, почему. Ваш Main() закончится до HttpClientCall() на самом деле завершается. А поскольку выход из Main() завершает работу всего приложения, ничего не будет напечатано.

Что вы должны сделать, это изменить свой метод на async Task и Wait() для этого в вашем Main(). (Смешивание await и Wait() часто может привести к тупикам, но это правильное решение для консольных приложений.)

class MainClass 
{ 
    public static void Main() 
    { 
     new Client().HttpClientCallAsync().Wait(); 
    } 
} 

public class Client 
{ 
    HttpClient client = new HttpClient(); 

    public async Task HttpClientCallAsync() 
    { 
     HttpClient httpClient = new HttpClient(); 
     HttpResponseMessage response = await httpClient.GetAsync("http://vendhq.com"); 
     string responseAsString = await response.Content.ReadAsStringAsync(); 
     Console.WriteLine(responseAsString); 
    } 
} 
+0

спасибо за эту неясную часть знаний! теперь это работает :) –

Смежные вопросы