Программа не видит вводимые параметры
public partial class Form1 : Form
{
private readonly HttpClient client;
private string ACCESS_TOKEN = "токен";
private string Version = "5.199";
public Form1()
{
InitializeComponent();
client = new HttpClient();
}
private void Form1_Load(object sender, EventArgs e)
{
}
async void MakeResponse()
{
HttpResponseMessage response = await client.GetAsync($"https://api.vk.com/method/status.get?users_id={ParamsInput.Text}&access_token={ACCESS_TOKEN}&v={Version}");
DataView.Text = await response.Content.ReadAsStringAsync();
}
private void ResponseButton_Click(object sender, EventArgs e)
{
MakeResponse();
DataView.Text = "Гружу...";
}
Когда я вписываю в ParamsInput какой-то айди , а затем создаю запрос, он просто игнорирует то что я вписывал и выдает результат не используя параметры. Когда на страничке с методом в документации я вписываю токен, айди и т.д. то все отлично работает. Что у меня не так в коде ?
Ответы (1 шт):
У вас есть большая проблема - async void
.
Представьте, асинхронная задача - это бумеранг, который вы запускаете. В данном случае, вы подразумеваете то, что вы бросаете бумеранг и не ловите его обратно. Там может появится исключение, о котором вы не узнаете сразу. А знаете, когда вы это узнаете? Когда GC начнёт собирать мусор, дойдёт до это этого потока, увидит, что он закончил свою работу, распакует и выбросит вам исключение. Другими словами, вы запускаете задачу, которая может в какой-то момент прилететь вам в затылок исключением.
Более того, вы не можете контролировать выполнение этой задачи - её не получится отменить.
Как можно улучшить этот код?
public async Task MakeResponse()
{
HttpResponseMessage response = await client.GetAsync($"https://api.vk.com/method/status.get?users_id={ParamsInput.Text}&access_token={ACCESS_TOKEN}&v={Version}");
DataView.Text = await response.Content.ReadAsStringAsync();
}
private async void ResponseButton_Click(object sender, EventArgs e)
{
DataView.Text = "Гружу...";
await MakeResponse();
}
Как можно ещё улучшить этот код?
private static async Task<string?> MakeResponse(string userId, string accessToken, string version)
{
try
{
HttpResponseMessage response = await client.GetAsync($"https://api.vk.com/method/status.get?users_id={userId}&access_token={accessToken}&v={version}");
return await response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
return null;
}
}
private void ResponseButton_Click(object sender, EventArgs e)
{
DataView.Text = "Гружу...";
{
var result = await MakeResponse(ParamsInput.Text, ACCESS_TOKEN, Version);
DataView.Text = result;
});
}
И вот ещё один вариант:
private static async Task<string?> MakeResponse(string userId, string accessToken, string version)
{
try
{
HttpResponseMessage response = await client.GetAsync($"https://api.vk.com/method/status.get?users_id={userId}&access_token={accessToken}&v={version}");
return await response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
return null;
}
}
private async void ResponseButton_Click(object sender, EventArgs e)
{
DataView.Text = "Гружу...";
var result = await MakeResponse(ParamsInput.Text, ACCESS_TOKEN, Version);
DataView.Text = result ?? "Ошибка";
}