gpt4 book ai didi

c# - 如何取消任务使其停止

转载 作者:太空宇宙 更新时间:2023-11-03 11:16:13 24 4
gpt4 key购买 nike

<分区>

我正在使用任务从数据库等读取一些数据。假设我无法更改 Dataaccess-API/-Layer。

此数据访问有时可能需要一些时间(网络流量等)。每次用户更改所选项目或更改显示可用数据子集的过滤器时,它都会加载。

最后我有一个我的任务启动方法的小例子。

我的问题是:如果用户在任务仍在运行时更改过滤器/选择,我该如何停止它运行?当使用取消 token 时,它将完成(因为我没有在任务中使用“大”循环,所以我不能只检查每次迭代是否有 .IsCancelled

我的想法是使用任务的返回类型来填充 SelectableVolts 并在分配新值之前检查 IsCancelled 上的返回任务。但是如何为异步任务执行此操作?

// added code at the bottom of this question

更新:在收到诸如“我不完全确定您的问题在问什么,但这应该可以帮助您了解一些可用选项”之类的评论后。我会尽量澄清我的问题。至少我希望如此 ;)

  1. 用户在数据网格中选择对象
  2. ViewModel 需要数据并向方法/类/foo 请求数据。
  3. 任务(A)开始
  4. 任务 (A) 仍在进行中。用户选择不同的对象/行。
  5. 重复步骤 1、2 和 3。所以 Task(A) 应该被取消/停止,一个新的 Task(B) 开始。
  6. 当 Task(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 中运行,这怎么可能?我在使用取消 token 时做错了什么吗?

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com