WinRT - загрузка данных с сохранением отзывчивости интерфейса
Я занимаюсь разработкой приложения для Windows Metro, и у меня возникает проблема с тем, что пользовательский интерфейс перестает отвечать на запросы. Насколько я могу судить, причина в следующем:
<ListView
...
SelectionChanged="ItemListView_SelectionChanged"
...
Это событие обрабатывается здесь:
async void ItemListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (this.UsingLogicalPageNavigation()) this.InvalidateVisualState();
MyDataItem dataItem = e.AddedItems[0] as MyDataItem;
await LoadMyPage(dataItem);
}
private async Task LoadMyPage(MyDataItem dataItem)
{
SyndicationClient client = new SyndicationClient();
SyndicationFeed feed = await client.RetrieveFeedAsync(new Uri(FEED_URI));
string html = ConvertRSSToHtml(feed)
myWebView.NavigateToString(html, true);
}
LoadMyPage
требуется некоторое время, чтобы получить данные из веб-службы и загрузить их на экран. Тем не менее, похоже, что пользовательский интерфейс его ждет: я предполагаю, что пока указанное событие не завершится.
Итак, мой вопрос: что я могу с этим сделать? Есть ли лучшее событие, к которому я могу подключиться, или есть другой способ справиться с этим? Я думал о запуске фоновой задачи, но это кажется мне излишним.
РЕДАКТИРОВАТЬ:
Просто, чтобы уточнить масштабы этой проблемы, я говорю о том, что максимум 3-4 секунды не отвечает. Это ни в коем случае не длительная работа.
РЕДАКТИРОВАТЬ:
Я попробовал некоторые из предложенных ниже предложений, однако весь стек вызовов изSelectionChanged
функция использует async / await. Я проследил это до следующего утверждения:
myFeed = await client.RetrieveFeedAsync(uri);
Который, кажется, не продолжает обработку, пока не завершится.
РЕДАКТИРОВАТЬ:
Я понимаю, что это превращается в войну Покойся, но ниже приведена копия проблемы с использованием пустого приложения в метро и кнопки:
XAML:
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<StackPanel>
<Button Click="Button_Click_1" Width="200" Height="200">test</Button>
<TextBlock x:Name="test"/>
</StackPanel>
</Grid>
Код позади:
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
SyndicationFeed feed = null;
SyndicationClient client = new SyndicationClient();
Uri feedUri = new Uri(myUri);
try
{
feed = await client.RetrieveFeedAsync(feedUri);
foreach (var item in feed.Items)
{
test.Text += item.Summary.Text + Environment.NewLine;
}
}
catch
{
test.Text += "Connection failed\n";
}
}