I want to display a Users Gravatar in my WPF-Application. This is how I bind the Image-Control:
<Image Source="{Binding Path=Email, Converter={StaticResource GravatarConverter},IsAsync=True}">
Where GravatarConverter returns the URL for the given Email. Unfortunately this is blocking my UI completely when loading the first Image. Please note that I am using "IsAsync=True". After some research I found out that I can hack around this issue when calling FindServicePoint in a separate thread on applications startup:
Task.Factory.StartNew( () => ServicePointManager.FindServicePoint( "http://www.gravatar.com", WebRequest.DefaultWebProxy ) );
But this is not working when FindServicePoint isn't finished while my Application is already downloading an image. Can someone please explain why a WPF-App needs this FindServicePoint at all, why this is blocking the UI and how to avoid the blocking?
Thanks
Update: As it turns out my problem disappeared after I unchecked "Automatic detect settings" in Internet Explorers "Internet Options"->"Connections"->"LAN Settings".
I used this VERY simple WPF-Application to reproduce the problem just by inserting an url for an image in the textbox and click the button. With "Automatic detect settings" enabled the app freezes for some seconds the first time an image gets loaded. With this option disabled its loading immediately.
MainWindow.xaml
<Window x:Class="WpfGravatarFreezeTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBox Grid.Column="0" Grid.Row="0" HorizontalAlignment="Stretch" x:Name="tbEmail" />
<Button Grid.Column="0" Grid.Row="0" Click="buttonLoad_OnClick" HorizontalAlignment="Right">Set Source</Button>
<Image x:Name="img" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" />
</Grid>
MainWindow.xaml.cs
using System;
using System.Windows;
using System.Windows.Media.Imaging;
namespace WpfGravatarFreezeTest
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void buttonLoad_OnClick( object sender, RoutedEventArgs e )
{
try { this.img.Source = new BitmapImage(new Uri(this.tbEmail.Text)); }
catch( Exception ){}
}
}
}