Программа не видит вводимые параметры

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 шт):

Автор решения: Frehzy

У вас есть большая проблема - 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 ?? "Ошибка";
}
→ Ссылка