gpt4 book ai didi

c# - 只需要 'most recent' 任务 - 取消/忽略的最佳实践?

转载 作者:太空狗 更新时间:2023-10-29 23:01:20 25 4
gpt4 key购买 nike

我有一个看起来像这样的任务:

var task = Task.Factory.StartNew <object>(LongMethod);
task.ContinueWith(TaskCallback, TaskScheduler.FromCurrentSynchronizationContext());

LongMethod 调用一个长时间运行的服务,在此期间我不能(或者至少,我认为我不能)不断轮询取消 token 以查看它是否已被取消。但是,我对“取消”或忽略回调方法很感兴趣。

当调用 TaskCallback 时,我只对“结果”感兴趣如果它来自最近的任务(让我们假设 LongMethod 调用的服务保持顺序,并且还假设用户可以多次点击该按钮,但只有最近一次是相关的)。

我按以下方式修改了我的代码:创建任务后,我将其添加到堆栈顶部。在 TaskCallback 中,我检查传递给回调的任务是否是最近的任务(即堆栈顶部的 TryPeek)。如果不是,我就忽略结果。

private ConcurrentStack<Task> _stack = new ConcurrentStack<Task>();

private void OnClick(object sender, ItemClickEventArgs e)
{
var task = Task.Factory.StartNew < object >( LongMethod);
task.ContinueWith(TaskCallback, TaskScheduler.FromCurrentSynchronizationContext());
_stack.Push(task);
}


private void TaskCallback(Task<object> task)
{
Task topOfStack;
if(_stack.TryPeek(out topOfStack)) //not the most recent
{
if (task != topOfStack) return;
}
//else update UI
}

我很确定这不是“最佳实践”解决方案。但什么是?传递和维护取消 token 似乎也不是那么优雅。

最佳答案

我个人认为以下方法是最优雅的:

// Cancellation token for the latest task.
private CancellationTokenSource cancellationTokenSource;

private void OnClick(object sender, ItemClickEventArgs e)
{
// If a cancellation token already exists (for a previous task),
// cancel it.
if (this.cancellationTokenSource != null)
this.cancellationTokenSource.Cancel();

// Create a new cancellation token for the new task.
this.cancellationTokenSource = new CancellationTokenSource();
CancellationToken cancellationToken = this.cancellationTokenSource.Token;

// Start the new task.
var task = Task.Factory.StartNew<object>(LongMethod, cancellationToken);

// Set the task continuation to execute on UI thread,
// but only if the associated cancellation token
// has not been cancelled.
task.ContinueWith(TaskCallback,
cancellationToken,
TaskContinuationOptions.NotOnCanceled,
TaskScheduler.FromCurrentSynchronizationContext());
}

private void TaskCallback(Task<object> task)
{
// Just update UI
}

关于c# - 只需要 'most recent' 任务 - 取消/忽略的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11163769/

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