Простой тест 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);
}
}