Chcę wyświetlić użytkownika Gravatar w mojej aplikacji WPF. W ten sposób wiążę kontrolę obrazu:Imagecontrol WPF zamarza UI
Gdzie GravatarConverter zwraca adres URL dla podanego adresu e-mail. Niestety to całkowicie blokuje mój interfejs podczas ładowania pierwszego obrazu. Zwróć uwagę, że używam "IsAsync = True". Po kilku badań okazało się, że mogę włamać się wokół tej kwestii podczas wywoływania FindServicePoint w osobnym wątku na starcie aplikacji:
Task.Factory.StartNew(() => ServicePointManager.FindServicePoint("http://www.gravatar.com", WebRequest.DefaultWebProxy));
Ale to nie działa, gdy FindServicePoint nie jest zakończona, gdy moja aplikacja jest już Pobieranie obraz. Czy ktoś może wyjaśnić, dlaczego aplikacja WPF w ogóle potrzebuje tego FindServicePoint, dlaczego blokuje interfejs użytkownika i jak uniknąć blokowania?
Dzięki
Aktualizuj: Jak się okazuje mój problem zniknął po I niezaznaczone "Automatyczne wykrywanie ustawień" w Internet Explorers "Opcje internetowe" -> "Połączenia" -> "Ustawienia sieci LAN".
Użyłem tej BARDZO prostej aplikacji WPF do odtworzenia problemu przez wstawienie adresu URL do obrazu w polu tekstowym i kliknięcie przycisku. Po włączeniu opcji "Automatyczne wykrywanie ustawień" aplikacja zatrzymuje się na kilka sekund po pierwszym załadowaniu obrazu. Z tą opcją natychmiast wyłączyło ładowanie.
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){}
}
}
}
Dziękuję bardzo.Niestety to wciąż blokuje mój interfejs użytkownika. Wygląda na to, że nie ma znaczenia, czy wykonam to asynchronicznie - problem wydaje się być wywołaniem ServicePointManager.FindServicePoint, które jest wykonywane raz na aplikację przy pierwszym pobraniu zdalnego obrazu. – user1130329
W moim przypadku wszystkie prace bez zamrażania. Gdzie nazywasz ServicePointManager.FindServicePoint? Czy możesz podać kod? Zwróć też uwagę, że ustawiłem IsAsync = True. – Deffiss
Okay Znalazłem "błąd" - ale to naprawdę dziwne: ma to związek z ustawieniami internetowymi w Internet Explorerze. Miałem "Automatyczne wykrywanie ustawień" w "Ustawienia" -> "Połączenia" -> "Ustawienia Lan" aktywowane. Kiedy go dezaktywuję, wszystko ładuje się idealnie, kiedy aktywuję, zamarza. Czy to wydaje się być problemem z systemem operacyjnym? – user1130329