using Avalonia.Media; using Avalonia.Media.Imaging; using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; namespace GSS2.UI.Core.ViewModels; public partial class AsyncImageRecordViewModel : ViewModelBase { private static readonly SemaphoreSlim _semaphore = new(1, 1); [ObservableProperty] public partial string Path { get; set; } [ObservableProperty] public partial IImage? Image { get; set; } [ObservableProperty] public partial bool IsLoading { get; set; } = true; public AsyncImageRecordViewModel(string path) { Path = path; } partial void OnPathChanged(string value) => _ = LoadAsync(); private async Task LoadAsync() { await _semaphore.WaitAsync(); try { var bitmap = await Task.Run(() => new Bitmap(Path)); await Dispatcher.UIThread.InvokeAsync(() => { Image = bitmap; IsLoading = false; }); } catch (Exception ex) { Console.Error.WriteLine($"Ошибка во время загрузки изображения:\n{ex.Message}\n{ex.StackTrace}"); await Dispatcher.UIThread.InvokeAsync(() => IsLoading = false); } finally { _semaphore.Release(); } } }