我希望在我的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应用程序需要这个FindServicePoint,为什么会阻塞UI以及如何避免阻塞?
谢谢。
更新:事实证明,当我在Internet选项的“连接”中取消选中“自动检测设置”后,我的问题消失了。
我使用了这个非常简单的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 ){}
}
}
}