我有一个在X秒后执行Action的方法,代码:
public void PerformCancelableAction(string name, Action action, int delay)
{
CancellationTokenSource cts = new CancellationTokenSource();
_cancellationTokens.Add(new Tuple<string, CancellationTokenSource>(name, cts));
Task.Factory.StartNew(async delegate
{
await Task.Delay(delay);
if (!cts.IsCancellationRequested)
action();
}, cts.Token).ContinueWith((prevTask) =>
{
//prevTask.Wait(); even with this
_cancellationTokens.RemoveAll(f => f.Item1 == name);
});
}
我添加了List<Tuple<string, CancellationTokenSource>>
动作的名称及其CTS,为什么?因此,当用户执行CancelAction(name)
时,我会在列表中查找名称,然后使用令牌取消。
现在,主要想法是工作。但是, ContinueWith 中的代码会在上一个操作完成之前执行,从逻辑上讲,它必须等待上一个操作否?
它必须等待Task.Delay以便用户有机会取消它,但是现在,由于CTS立即从列表中删除,因此无法取消操作..
知道为什么吗?谢谢!