Разбираюсь с работой с 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 результата исполнения функции, всё тоже начинает работать. Значит, проблема не в самой функции, а именно в моменте, когда то, что она возвращает направляется в переменную. Почему так может быть?
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:28MainForm_Loadасинхронной, чтобы потом зайти и понять, что она у меня уже была асинхронной. Мда, а ларчик просто открывался. Спасибо за помощь. – brizgalka Dec 18 '23 at 03:34