我正在使用任务从数据库等中读取一些数据。让我们假设我无法更改Dataaccess-API/Layer。如何取消任务,使其停止
此数据访问有时可能需要一些时间(网络流量等)。它将在用户更改选定项目或更改显示可变数据的子集的筛选器时加载。
最后我有一个我的Task-Start-Method的小例子。
我的问题是:如果用户在任务仍在运行时更改过滤器/选择,我该如何阻止它运行?当使用取消令牌时,它会完成(因为我没有在任务中使用“大”循环,我不能只检查.IsCancelled
的每次迭代。
我的想法是使用任务的返回类型填补了SelectableVolts
和分配新值之前检查返回任务上IsCancelled
但如何为异步任务做到这一点
// added code at the bottom of this question
更新:?获得评论等之后,“我不能完全确定你的问题是要求,但这应该有助于你感受一些可行的选择。“我会试着澄清我的问题一点,至少我希望如此;)
- 用户在数据网格
- 视图模型需要数据并且请求数据的方法/类/ foo的选择对象。
- 任务(A)开始
- 任务(A)仍在工作。用户选择不同的对象/行。
- 重复步骤1,2和3。所以任务(A)应该被取消/停止并且新的任务(B)开始。
- 当任务(B)完成时,应显示其数据。绝不应该让任务(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
运行这怎么可能?我是否在取消令牌上出现错误?
请将您自己的答案移出问题并转化为下面的实际答案(即回答自己的问题)。然后接受你自己的答案,如果它对你有用。 – tomfanning
好的 - 我只是想让@Killercam感谢我向他展示正确的方式。但是你是对的,也许当标记为答案时,“真正的”答案会被发现。 – basti