0

Выношу загрузку информации в другие потоки через Task.Run и столкнулся с проблемой.

Этот код работает:

Task.Run(()=> News.Load().ContinueWith(news =>
        {
            foreach (NewsObject n in news.Result)
            {
                this.Dispatcher.Invoke(() =>
                {
                    Home_NewsListView.Items.Add(new TextBlock().Text = n.Title);
                });
            }
        }));

News.Load() это async Task

Но если я хочу загрузить изображение в Image, то появляется исключение Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток.:

Task.Run(()=> UserProfile.loaduseravatar(User).ContinueWith(avatar =>
        {
            this.Dispatcher.Invoke(() =>
            {
                if (avatar.Result != null)
                {
                    User_avatar.Source = avatar.Result; //Тут вылезает исключение
                }
            });
        }));

UserProfile.loaduseravatar(User) это async Task

public static async Task <BitmapImage> loaduseravatar(UserInfo User)
    {
        try
        {
            BitmapImage bitmap = new BitmapImage();
            bitmap.BeginInit();
            bitmap.UriSource = new Uri(User.AvatarURL);
            bitmap.EndInit();
            return bitmap;
        }
        catch (Exception ex)
        {
            return null;
        }
    }
FAR747
  • 447
  • Методы показывайте целиком, где это происходит. А лучше вообще весь класс. Вы перепутали асинхронное и многопоточное программирование, и чтобы это исправить, надо вообще понять, что происходит. – aepot Jul 08 '21 at 18:24
  • 1
    Оу, работа с контролами в код-бихайнде - это удел очень суровых разработчиков. Давайте весь код-бихайнд и xaml разметку, попробуем привести в порядок. Если кратко, то WPF очень сильно отличается от винформ, подходом к разработке, но вы как-то смогли этот момент упустить и поехали напролом...и приехали. :) – aepot Jul 08 '21 at 18:30
  • 1
  • Используйте привязки, это основа основ WPF! 2. Зачем вам тут загрузка аватарки? Почему нельзя сразу ее отобразить? 3. Почему вы используете async/await так... топорно? Где вообще ключевые слова async и await? Почему .Result;? 4. static... Серьезно?
  • – EvgeniyZ Jul 08 '21 at 18:32
  • Метод loaduseravatar внезапно не является асинхронным, он синхронный. – aepot Jul 08 '21 at 18:37
  • 1
    @aepot в общем я намудрил знатно. Как понял проще всего это сделать через XAML: <Image Height="100" Width="100" Source="{Binding Uri}"/> и подгружать туда изображение через cs:var vm = (VM)DataContext; vm.Uri = User.AvatarURL; – FAR747 Jul 08 '21 at 19:25