我正在使用任务从数据库等中读取一些数据。假设我无法更改 Dataaccess-API/-Layer。
这种数据访问有时可能需要一些时间(网络流量等)。每次用户更改所选项目或更改显示可用数据子集的过滤器时,都会加载它。
最后,我有一个任务启动方法的小例子。
我的问题是:如果用户在任务仍在运行时更改了过滤器/选择,我该如何阻止它运行?使用取消令牌时,它将完成(因为我没有在任务中使用“大”循环,所以我不能只检查每次迭代的.IsCancelled
.
我的想法是在分配新值之前使用任务的返回类型来填充SelectableVolts
并检查返回的任务。IsCancelled
但是如何为异步任务执行此操作?
// added code at the bottom of this question
更新:在收到诸如“我不完全确定您的问题要问什么,但这应该可以帮助您了解一些可用选项”之类的评论后。我会尽量澄清我的问题。至少我希望如此;)
- 用户在数据网格中选择对象
- ViewModel 需要数据并向方法/类/foo 请求数据。
- 任务(A)开始
- 任务(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
这怎么可能?我对取消令牌做错了吗?