タスクを使用してデータベースなどからデータを読み取ります。Dataaccess-API/-Layerを変更できないと仮定します。
このデータアクセスには時間がかかる場合があります(ネットワークトラフィックなど)。ユーザーが選択したアイテムを変更したり、使用可能なデータのサブセットを表示するフィルターを変更したりするたびに読み込まれます。
最後に、Task-Start-Methodの例を少し示します。
私の質問は次のとおりです。タスクの実行中にユーザーがフィルター/選択を変更した場合、どうすればタスクの実行を停止できますか?キャンセルトークンを使用すると、終了します(タスクで「大きな」ループを使用していないため、すべての反復をチェックすることはできません.IsCancelled
。
私のアイデアは、新しい値を割り当てる前に、タスクの戻りタイプを使用して、戻りタスクを入力してSelectableVolts
確認することでした。IsCancelled
しかし、非同期タスクに対してこれを行う方法は?
// added code at the bottom of this question
更新:「あなたの質問が何を求めているのか完全にはわかりませんが、これはいくつかの利用可能なオプションの感触をつかむのに役立つはずです」などのコメントを受け取った後。私の問題を少し明確にしようと思います。少なくとも私はそう願っています;)
- ユーザーがデータグリッドでオブジェクトを選択します
- ViewModelはデータを必要とし、メソッド/クラス/fooにデータを要求します。
- タスク(A)が開始されます
- Task(A)はまだ機能しています。ユーザーが別のオブジェクト/行を選択します。
- 手順1、2、3が繰り返されます。したがって、タスク(A)をキャンセル/停止して、新しいタスク(B)を開始する必要があります。
- Task(B)が終了すると、そのデータが表示されます。Task(A)のデータを利用できるようにすることは決してできません。
したがって、問題は次のとおりです。正しい方法でステップ5と6を達成する方法。
完全なコード:
private CancellationToken cancelTokenOfFilterTask;
private CancellationTokenSource cancelTokenSourceOfFilterTask;
private void FilterVolts()
{
if (IsApplicationWorking)
{
cancelTokenSourceOfFilterTask.Cancel();
}
// Prepare CancelToken
cancelTokenSourceOfFilterTask = new CancellationTokenSource();
cancelTokenOfFilterTask = cancelTokenSourceOfFilterTask.Token;
IsApplicationWorking = true;
if (SelectableVolts != null && SelectableVolts.Count >= 0)
{
VoltThatIsSelected = null;
SelectableVolts.Clear();
}
Task voltLoadTask = null;
voltLoadTask = Task.Factory.StartNew<List<SelectableVoltModel>>(() => {
VoltsLoader loader = new VoltsLoader();
Thread.Sleep(2000);
var listOfVolts = loader.LoadVoltsOnFilter(_sourceOfCachableData, ChosenFilter);
return listOfVehicles;
}, cancelTokenOfFilterTask).ContinueWith(listSwitcher =>
{
switch (listSwitcher.Status)
{
case TaskStatus.RanToCompletion:
SelectableVolts = new ObservableCollection<SelectableVoltsModel>(listSwitcher.Result);
IsApplicationWorking = false;
break;
case TaskStatus.Canceled:
Console.WriteLine("Cancellation seen"); // Gets never called
break;
default:
break;
}
});
}
どういうわけか、このメソッドを複数回呼び出すと、すべてがTaskStatus.RanTocompletion
どのように実行されますか?キャンセルトークンで何か間違ったことをしていますか?