5

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 ){}            
        }
    }   
}
4

1 に答える 1