我正在开发一款Windows Metro应用程序,在处理UI时出现了不响应的问题。据我所知,原因如下:
<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
需要一些时间才能完成,因为它从网络服务获取数据并将其加载到屏幕上。然而,UI似乎在等待它完成:我猜测是直到上述事件完成为止。所以我的问题是:我该怎么办?是否有更好的事件可以连接,或者有其他处理方式?我考虑过启动一个后台任务,但这对我来说似乎有点过度。
编辑:
仅澄清一下这个问题的规模,我说的是最多3-4秒无响应。这绝不是一个长时间运行的任务。
编辑:
我尝试了下面的一些建议,然而,从
SelectionChanged
函数的整个调用堆栈都在使用async/await。 我已经追踪到了这个语句:myFeed = await client.RetrieveFeedAsync(uri);
这似乎是一种只有等待完整处理后才会继续处理的情况。
编辑:
我意识到这已经变成了战争与和平,但下面是在空白的 Metro 应用和按钮中复制问题的内容:
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";
}
}
foreach
循环,我会得到相同的行为。 - Paul MichaelsRetrieveFeedAsync
的调用。 - Paul Michaels