ありがとうございます。 `GridViewに項目を追加するのにforeachを使いたいです。これは、の非同期メソッドで行われます。 私は他の非同期方法からアイテムを取得し、GridViewの中でそれらを表示したい:uwp C#非同期タスクをキャンセルして再実行
public async Task SetGridItems(CancellationToken ct, /* and some items */)
{
GridItems.clear();
//get two list of item I want
var ListA = await getBmethodAsync().AsTask(ct);
var ListB = await getAmethodAsync().AsTask(ct);
foreach (itemA A in ListA)
{
GridItem i = new GridItem();
//set name
i.name = A.Name;
//get icon
i.image = img;
GridItems.Add(i);
}
foreach (ItemB b in ListB)
{
GridItem i = new GridItem();
i.name = b.Name;
i.image.SetSource(icon);
GridItems.Add(i);
}
}
コンテンツは便宜上簡略化されています。
私はボタンのクリックハンドラでこのメソッドを実行します。ここでは
private async void check_btn2_Click(object sender, RoutedEventArgs e)
{
if (cts != null) {
cts.Cancel();
debug.Text = "cancel a job 4";
}
cts = new CancellationTokenSource();
try
{
await SetGridItems(ct.Token, /* and some items */).AsAsyncAction().AsTask(cts.Token);
}
catch (OperationCanceledException) { debug.Text = "cancel a job"; }
}
は問題です:
私は二回(高速クリック)このボタンをクリックした場合: - 最初のクリックで、イベントコールバックが呼び出され、タスクの実行が開始されます - 何かがGridView
に表示されますが、完了しません(80%で終了) - 2回目のクリックで、GridView
が期待どおりにクリアされ、新しいコンテンツが読み込まれますGriView
はオンです最初のクリックタスクの最後の20%を表示する
なぜ、2回目のクリックではなく、が最初のタスクをキャンセルするのですか?
ネットで長時間探していますが、ナッツは何も見つかりませんでした。助けて、これを達成する方法をいくつか考えてみてください。
私は、私がここに二つの問題を参照英語が得意ではないですし、感謝
に役立ちます。最初の見方では、あなたのコードは正しいようです。私の唯一の関心事は 'SetGridItems(ct.Token、/ * and some items * /)'の後でやっている 'AsAsyncAction().AsTask(cts.Token);'です。既にキャンセルトークンをメソッドに提供している場合は、 'AsTask()'を使って再度取り消す必要はありません。あなたの 'getBmethodAsync()'と 'getAmethodAsync()'にも同じことが当てはまります。あなたはキャンセルトークンを直接提供して、必要な処理を行うことができます。私の推測では、外部の取り消しがこの副作用を生み出しているということです。 – Vincent
VincentとCKIIの助けを借りてくれてありがとう、ct.ThrowIfCancellationRequested(); –