Простой тест HttpClient не работает на Mono

При выполнении этого простого небольшого теста на Mono (3.2.1) в Mac OS X он никогда не печатает никакого ответа на консоль, а вместо этого говорит Shutting down finalizer thread timed out.
Что-то не так с этим кодом или мой 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);
        }
    }
}

1 ответ

Решение

Вы почти никогда не должны использовать 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);
    }
}
Другие вопросы по тегам