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
Webサービスからデータを取得して画面にロードするため、完了するまでに時間がかかります。ただし、UIがそれを待っているように見えます。私の推測では、上記のイベントが完了するまでです。
だから私の質問は:これについて私は何ができますか?私がフックできるより良いイベントはありますか、またはこれを処理する別の方法はありますか?バックグラウンドタスクを開始することを考えましたが、それは私にはやり過ぎのようです。
編集:
この問題の規模を明確にするために、最大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";
}
}