gpt4 book ai didi

c# - 仅运行当前任务和最近排队的任务

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

我有一些方法。我们称它们为“TurnOn”和“TurnOff”。每个都返回一个未启动的任务(如在 System.Threading.Tasks.Task 中)。一旦开始,任务大约需要一秒钟才能完成。我有一些代码使用 Task.ContinueWith 方法将它们排队(显示为 here )。问题是我真的只想要当前正在运行的任务(如果有的话)加上最近请求的任务来运行。目前,如果我的用户在一秒钟内切换开/关开关十次,我的代码需要二十秒才能 catch 。这只是我关心的最后一个要求。我怎样才能做到这一点?我看不到 ContinueWith 方法内部的方法来知道它之后是否有另一个 ContinueWith 方法。我一直在看这个例子 here , 但不太明白如何应用它。

更新:现在可以在此处的库中找到:https://github.com/BrannonKing/Kts.ActorsLite .它被命名为“最新...”

最佳答案

只需创建一个类来跟踪当前正在执行的任务、接下来要运行的操作,并在前一个操作完成时运行“下一个”操作。这里的关键是,如果下一个 Action 有一个值,当你去排队一个新的时,你可以简单地替换 nextTask 而不是添加另一个延续。

public class TaskQueue
{
private Task currentlyExecuting = Task.FromResult(false);
public Task continuation = null;
private CancellationTokenSource cts = new CancellationTokenSource();
private Action nextTask = null;
private object key = new object();
public Task Queue(Action action)
{
lock (key)
{
if (nextTask == null)
{
nextTask = action;
ScheduleContinuation();
return continuation;
}
else
{
cts.Cancel();
nextTask = action;
ScheduleContinuation();
return continuation;
}
}
}

private void ScheduleContinuation()
{
cts = new CancellationTokenSource();
var token = cts.Token;
continuation = currentlyExecuting.ContinueWith(t =>
{
lock (key)
{
currentlyExecuting = Task.Run(nextTask);
token.ThrowIfCancellationRequested();
nextTask = null;
}
}, cts.Token);
}
}

虽然您可以在这里接受未开始的任务,并且这样做是一个非常微不足道的重写,但我认为最好的做法是在这里接受委托(delegate)并创建然后在它出现时开始任务准备开始。

关于c# - 仅运行当前任务和最近排队的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21683945/

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