Не работает блокировка кнопки перед асинхронным методом и после го выполнения

Рейтинг: 0Ответов: 1Опубликовано: 21.05.2023

Делаю запрос к сайту, сам запрос длится какое-то время 3 - 5 сек. Чтобы пользователь не тикаk снова по кнопке перед выполнением метода с запросом ее блокирую, а после уже выполнения питаюсь разблокировать. Методы как бы асинхронные но не работает, подскажите что не так сделал?

async Task<bool> Test()
{

    try
    {

        var request = (HttpWebRequest)WebRequest.Create("https://mysitecom/prog-api/ver.php");

        var postData = "v=" + Uri.EscapeDataString(progVer);
        var data = Encoding.ASCII.GetBytes(postData);

        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = data.Length;

        using (var stream = request.GetRequestStream())
        {
            stream.Write(data, 0, data.Length);
        }

        var response = (HttpWebResponse)request.GetResponse();

        var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();


        Console.WriteLine("END");
        return true;
    } 
    catch
    {
        return false;
        
    }
    

}

private async void runPoster_Click(object sender, RoutedEventArgs e)
{
    runPoster.IsEnabled = false;
    await Test();
    runPoster.IsEnabled = true;

}

Сейчас вишел с положения таким образом, не знаю на сколько это правильно но все же. Если можно проще подскажите.

    async Task<bool> Test()
    {

        runPoster.IsEnabled = false;
        string status = "";

        await Task.Run(() =>
        {

            try
            {

                var request = (HttpWebRequest)WebRequest.Create("https://mysite.com/prog-api/ver.php");

                var postData = "v=" + Uri.EscapeDataString(progVer);
                var data = Encoding.ASCII.GetBytes(postData);

                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = data.Length;

                using (var stream = request.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }

                var response = (HttpWebResponse)request.GetResponse();

                var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
                Console.WriteLine(responseString);
                if (responseString != progVer)
                {
                    MessageBox.Show("Ваша версия программы устарела, скачайте новую версию!");
                    return;
                }

                status = "1";
                return;

            }
            catch
            {
                MessageBox.Show("Сервис не доступен!");
                return;

            }


        });

        runPoster.IsEnabled = true;
        if (status == "1")
        {
            return true;
        }
        else
        {
            return false;
        }


    }


    private async void runPoster_Click(object sender, RoutedEventArgs e)
    {

        bool status = await Test();
        if (status == false)
        {
            return;
        }

        MessageBox.Show("ВСЕ ОК!");


    }

Ответы

▲ 1

Ответ на собственный вопрос. Сделал так.

private static readonly HttpClient client = new HttpClient();

private async Task<bool> CheckVersionAsync(string version)
{
    var values = new Dictionary<string, string>
    {
        ["v"] = version
    };
    var content = new FormUrlEncodedContent(values);

    using var response = await client.PostAsync("https://mysite.com/prog-api/ver.php", content);
    response.EnsureSuccessStatusCode();
    string responseString = await response.Content.ReadAsStringAsync();

    return responseString == version;
}

private async void runPoster_Click(object sender, RoutedEventArgs e)
{
    runPoster.IsEnabled = false;

    try
    {
        bool status = await CheckVersionAsync(progVer);

        if (status)
        {
            MessageBox.Show("ВСЕ ОК!");
        }
        else
        {
            MessageBox.Show("Ваша версия программы устарела, скачайте новую версию!");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

    runPoster.IsEnabled = true;
}