Помогите разобраться с потоками WPF
Выношу загрузку информации в другие потоки через 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;
}
}
Ответы (1 шт):
Автор решения: FAR747
→ Ссылка
В итоге сделал так:
XAML:
Image x:Name="avatar" HorizontalAlignment="Left" Height="64" Margin="2.5,0,0,0" Width="64" Source="{Binding AvatarUri, IsAsync=True}"/>
Code Behind:
class VMData : INotifyPropertyChanged
{
string avataruri;
public string AvatarUri
{
get => avataruri;
set
{
avataruri = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(AvatarUri)));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
public MainWindow()
{
InitializeComponent();
DataContext = new VMData();
logincomplete();
}
private void logincomplete()
{
var vm = (VMDataContext)DataContext;
vm.AvatarUri = "https://www.gravatar.com/avatar/616c357f3f6fe7d3bc84bd495b43d93c";
}