Вот новый ответ для вас, надеюсь, лучше, чем мой предыдущий.
Когда вы создаете привязку с true 'IsAsync', она выполняет доступ к свойству Author.IconUrl в отдельном потоке, но выполняет преобразование из Uri в ImageSource в основном потоке. Как вы обнаружили, преобразование выполняет поиск DNS в основном потоке, вызывая блокировку приложения.
Поскольку ваш источник http / https, WPF автоматически обрабатывает асинхронную загрузку источника изображения. Поэтому я подозреваю, что все, что вам нужно сделать, это сделать только поиск DNS асинхронным.
Это можно автоматизировать с помощью прикрепленного свойства:
<Image my:ImageAsyncHelper.SourceUri="{Binding Author.IconUrl}" />
где ImageAsyncHelper определяется как:
public class ImageAsyncHelper : DependencyObject
{
public static Uri GetSourceUri(DependencyObject obj) { return (Uri)obj.GetValue(SourceUriProperty); }
public static void SetSourceUri(DependencyObject obj, Uri value) { obj.SetValue(SourceUriProperty, value); }
public static readonly DependencyProperty SourceUriProperty = DependencyProperty.RegisterAttached("SourceUri", typeof(Uri), typeof(ImageAsyncHelper), new PropertyMetadata
{
PropertyChangedCallback = (obj, e) =>
{
((Image)obj).SetBinding(Image.SourceProperty,
new Binding("VerifiedUri")
{
Source = new ImageAsyncHelper { GivenUri = (Uri)e.NewValue },
IsAsync = true,
});
}
});
Uri GivenUri;
public Uri VerifiedUri
{
get
{
try
{
Dns.GetHostEntry(GivenUri.DnsSafeHost);
return GivenUri;
}
catch(Exception)
{
return null;
}
}
}
}
Как это работает:
- Когда вы устанавливаете присоединенное свойство, оно создает экземпляр ImageAsyncHelper и асинхронно связывает Image.Source с типом ImageSource объекта асинхронного помощника.
- Когда срабатывает асинхронная привязка, она вызывает метод получения VerifiedUri, который проверяет доступность адреса, а затем возвращает GivenUri
- Если свойство IconUri когда-либо изменяется, привязка приводит к обновлению присоединенного свойства, которое создает и привязывает новый ImageAsyncHelper, поэтому изображения остаются актуальными.