我想在我的 WPF 应用程序中显示用户 Gravatar。这就是我绑定图像控件的方式:
<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 的“Internet 选项”->“连接”->“LAN 设置”中的“自动检测设置”后,我的问题就消失了。
我使用这个非常简单的 WPF 应用程序来重现问题,只需在文本框中插入图像的 url 并单击按钮。启用“自动检测设置”后,应用程序会在第一次加载图像时冻结几秒钟。使用此选项立即禁用其加载。
主窗口.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>
主窗口.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 ){}
}
}
}