-1

Разбираюсь с работой с REST API в C#. Получилось так, что почему-то окно приложения Windows Forms перестало открываться, когда я вызываю свой метод для получения списка загруженных на сервер видео.

namespace TVizard_GUI
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
    private void timer1_Tick(object sender, EventArgs e)
    {
        clockLabel.Text = DateTime.Now.ToString("HH:mm:ss");
    }

    private void MainForm_Load(object sender, EventArgs e)
    {
        Video[] videos = API.GetVideoListAsync().Result;
        //Array.ForEach(videos, video =>
        //{
        //    videoList.Items.Add(video.filename);
        //});
    }
}

public class Video
{
    public string filename { get; set; }
    public int duration { get; set; }
    public string durationReadable { get; set; }
}

static class API
{
    private static HttpClient client = new();

    public static async Task<Video[]> GetVideoListAsync()
    {
        var response = await client.GetAsync("http://localhost:3000/uploadedVideos");
        var videos = await JsonSerializer.DeserializeAsync<Video[]>(response.Content.ReadAsStream());

        return videos;
    }
}

}

Когда я комментирую присвоение переменной videos результата исполнения функции, всё тоже начинает работать. Значит, проблема не в самой функции, а именно в моменте, когда то, что она возвращает направляется в переменную. Почему так может быть?

brizgalka
  • 54
  • 5
  • https://ru.stackoverflow.com/a/767911/220553 – EvgeniyZ Dec 18 '23 at 01:45
  • @EvgeniyZ, из поста стало понятно только, что стоило бы заменить мой GetVideoList().Result на await. Но я не могу так сделать, потому что функция MainForm_Load не асинхронная и сделать я её такой не могу. Мне вынести всё общение с сервером в отдельный поток или что? Не совсем понимаю ход мысли. – brizgalka Dec 18 '23 at 03:10
  • async void MainForm_Load(...) { var videos = await API.GetVideoListAsync(); }. Если коротко, вызывая .Result и не используя await, ваша логика синхронна, она выполняется в UI потоке, тем самым вы его и вешаете. Не используйте асинхронные задачи без await и не используйте .Result без ожидания ( например var task = await SomeTask(); var result = task.Result; ). – EvgeniyZ Dec 18 '23 at 03:28
  • @EvgeniyZ, я накатала стену текста о том, как не могу сделать функцию MainForm_Load асинхронной, чтобы потом зайти и понять, что она у меня уже была асинхронной. Мда, а ларчик просто открывался. Спасибо за помощь. – brizgalka Dec 18 '23 at 03:34

1 Answers1

1

Решила проблему, сделав функцию MainForm_Load асинхронной. По какой-то причине, когда я это делала изначально, IDE выдавала мне ошибку. Скорее всего поэтому я и не дошла до этого сразу. Сейчас просто вызываю нужный метод через await.

private async void MainForm_Load(object sender, EventArgs e)
{
    Video[] videos = await API.GetVideoListAsync();
    Array.ForEach(videos, video =>
    {
        videoList.Items.Add(video.filename);
    });
}

В остальном коде никаких изменений нет.

brizgalka
  • 54
  • 5