所以我想为此编写一个TaskScheduler
,但该接口没有提供一种机制来确保所有任务都有一个取消令牌并能够取消已经运行的任务,所以我们必须使用一个调度程序来完成不遵循提供的 TPL 模型/接口。
当安排第一个任务时取消前一个任务(如果没有前一个任务或者它已经完成,它将不会做任何事情)。接下来,它将当前任务设置为直到前一个任务结束才开始的任务,并在其主体中运行给定的操作。需要Alock
以便如果有两个调用Schedule
一个将立即取消另一个,并且未取消的版本将是分配给 的那个current
。
public class SingleThreadedKillPredecssorScheduler
{
private Task current = Task.FromResult(true);
private CancellationTokenSource cts = new CancellationTokenSource();
private object key = new object();
public Task Schedule(Action<CancellationToken> action)
{
lock (key)
{
cts.Cancel();
cts = new CancellationTokenSource();
current = current.ContinueWith(t => action(cts.Token), cts.Token);
return current;
}
}
public Task<T> Schedule<T>(Func<CancellationToken, T> function)
{
lock (key)
{
cts.Cancel();
cts = new CancellationTokenSource();
var next = current.ContinueWith(t => function(cts.Token), cts.Token);
current = next;
return next;
}
}
}