WPF アプリケーションにユーザー Gravatar を表示したいと考えています。これは、Image-Control をバインドする方法です。
<Image Source="{Binding Path=Email, Converter={StaticResource GravatarConverter},IsAsync=True}">
GravatarConverter が特定のメールの URL を返す場所。残念ながら、これは最初の画像をロードするときに UI を完全にブロックしています。「IsAsync=True」を使用していることに注意してください。いくつかの調査の結果、アプリケーションの起動時に別のスレッドで FindServicePoint を呼び出すと、この問題を回避できることがわかりました。
Task.Factory.StartNew( () => ServicePointManager.FindServicePoint( "http://www.gravatar.com", WebRequest.DefaultWebProxy ) );
しかし、アプリケーションが既にイメージをダウンロードしている間に FindServicePoint が終了していない場合、これは機能しません。なぜWPF-AppがこのFindServicePointを必要とするのか、なぜこれがUIをブロックしているのか、ブロックを回避する方法を説明してもらえますか?
ありがとう
更新: Internet Explorer の [インターネット オプション] -> [接続] -> [LAN 設定] で [自動検出設定] のチェックを外したところ、問題が解決しました。
この非常に単純な WPF アプリケーションを使用して、テキスト ボックスに画像の URL を挿入し、ボタンをクリックするだけで問題を再現しました。「自動検出設定」を有効にすると、最初に画像が読み込まれたときにアプリが数秒間フリーズします。このオプションを使用すると、読み込みがすぐに無効になります。
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 ){}
}
}
}